정규표현식
컨텐츠 정보
- 19,210 조회
- 0 추천
- 목록
본문
정규표현식 tutorials
http://zvon.org/comp/r/tut-Regexp.html#Pages~Contents
정규표현식
1. 대소문자 민감하게 구분
2. 띄어쓰기 민감하게 구분
3. 캐럿 ^ 행의 시작 부분에 위치하는 것 ^who
$ 행의 끝 부분에 위치하는 것 who$
4. $ 나 ^ 이 찾을 문자열 안에 위치하고 있다면
\뒤에오는 기호를 단순한 문자로 만들어줌 escape ^\$ \$$
5. 점 . 은 어떤 문자든기호든 상관없이 가리킨다. any character
6. 문자 . 을 선택하고 싶으면 \를 쓰면 된다. \. 은 문자 .
7. 대괄호 squre brackets [] 안에 있는 하나하나의 문자에서 어떤 문자든 찾는다. []는 문자 1개를 의미함 [owy][yow]
8. range - 기호 [abcd]는 [a-d]와 같다. [C-K2-6]
9. [] 안의 ^는 부정 not 의 의미이다. [^CD]는 문자C,D를 제외한 모든 문자
10. 파이프 | 는 or 의 의미이다. (Mon|Tues|Fri)day
11. 수량자 Quantifiers 기호 앞에 위치한 패턴이 몇번 등장하는가
* 0~여러개 a*b 이면 a가 0개~여러개일 수 있음
+ 1~여러개 a+b 이면 a가 1개~여러개일 수 있음
? 0~1개 a?b 이면 a가 0개~1개인 경우. 여러개인 경우는 선택되지 않음
12. * 앞에 패턴이 0~여러개 일때 사용 예시
.* 은 모든 문자, -A*-는 A가 0개~여러개일 수 있음
13. + 앞에 패턴이 1~여러개 일때 사용 예시
\*+ 별이 한개에서 여러개, -@+- 일때는 @가 1개~여러개일 수 있음, [^ ]+는 공백이 아닌것이 다 선택됨
14. ? 앞에 패턴이 0~1개 일 때 사용 예시
-@?@?@?- 일때 @의 하나의 개수가 0개~1개일 수 있음
15. 원하는 수량을 정확하게 지정하는 방법 {수량}
.{5} 는 어떤 문자건 5글자,
[els]{1,3} 는 e 또는 l 또는 s가 일치하는 문자가 1개~3개
[a-z]{3,}는 a-z까지의 문자 하나가 3개이상일 때
16. * 0~여러개, + 1~여러개, ? 0~1개 이므로 중괄호로도 표현할 수 있다.
AB*A AB{0,}A
AB+A AB{1,}A
AB?A AB{0,1}A
17. 수량자 뒤에 ?가 오면 앞에있는수량자의 최소개수를 의미함.
* 0~多, + 1~多, ? 0~1개 인데
탐욕적 수량자 greedy quantifiers
r.* r뒤에 어떤 글자가 0~多 중 최대한 큰 덩어리
r.+ r뒤에 어떤 글자가 1~多 중 최대한 큰 덩어리
r.? r뒤에 어떤 글자가 0~1 중 최대한 큰 덩어리
게으른 수량자 lazy quantifier
r.*? r 뒤에 어떤글자가 0~多 중 최소 덩어리
r.+? r 뒤에 어떤글자가 1~多 중 최소 덩어리
r.?? r 뒤에 어떤글자가 0~1 중 최소 덩어리
18. [A-z0-9_] 와 \w 는 같은 뜻이다.
\w word 단어. (알파벳숫자_)을 의미. 공백은 word 안에 포함되지 않는다.
\w{5} word단어인 문자 5개
19. [^A-z0-9_]와 \W는 같은 뜻이다. \W는 not word 를 의미한다.
20. \s 는 공백문자 space, new line, tab 을 의미한다.
\S 는 공백문자가 아닌 것을 의미한다.
21. \d 는 digit의 약자로 0~9까지의 숫자를 의미한다. [0-9]와 같은 뜻이다.
\D 는 숫자가 아닌 것을 의미한다.
22. 단어의 경계를 의미하는 word boundary \b 는 위치에 따라서 의미가 달라진다
\bcat 은 단어 맨앞글자가 cat으로 시작할 때의 cat을 찾는다.
cat\b 는 단어 맨뒷글자가 cat으로 끝날 때의 cat을 찾는다
\bcat\b 처럼 문자를 감싸면 cat 의 앞뒤에 아무것도 없는 정확하게 일치하는 cat을 찾는다.
\b.은 단어의 첫글자만을 선택한다(공백포함됨)
23. \B는 \b의 반대를 의미한다.
\B. 은 단어의 첫글자를 제외한(공백을 포함하지 않고) 문자들이 선택된다.
.\B 은 단어의 마지막글자를 제외한(공백을 포함하지 않고) 문자들이 선택된다.
\B.\B는 단어의 첫글자와 마지막글자를 제외한 (공백을 포함하지 않고) 문자들이 선택된다.
24. \A는 행의 시작이라는 의미 \Z는 행의 마지막이라는 의미
\A... 은 행이 시작되는 곳의 3문자
...\Z 는 행이 끝나는 곳의 3문자
\A와 ^ , \Z와 $ 는 multiline을 해제했을 때는 같은 결과가 나오지만
multililne을 체크했을 경우 ^와 $는 한줄마다 맨앞과 맨뒤의 결과를 찾는다.
(RegExr v2.1에서는 \A 와 \Z는 결과가 적용되지 않는다.)
25. (?= pattern) 은 pattern이 있는지 찾지만 검색결과에서는 제외한다.
\w+(?=X) word가 1~多개이고 X로 끝나는 문자를 찾는다. 그러나 결과에서 X는 제외한다.
26. (?!= pattern) 은 pattern이 있는지 찾고, 만약 해당되는 것이 있다면 그 결과는 제외한다.
그외
[] 안의 .은 임의의 문자가 아니라 문자 . 을 의미한다
정규표현식 결과 확인 사이트
정규표현식을 시각화해서 보여주는 사이트
블로그 링크 - php 정규표현식
http://blog.naver.com/faith5c/220811168994
블로그 링크 - javascript 정규표현식
http://blog.naver.com/faith5c/220772490785
블로그 링크 - 정규표현식
http://blog.naver.com/faith5c/220811131415
1. 구분자
php 정규표현식은 구분자 필요
키보드 숫자있는 줄에있는 기호는 이스케이핑 문자와 () 외에 다 구분자로 쓸 수 있음
/foo bar/
#foo bar#
+foo bar+
%foo bar%
~foo bar~
2. 패턴변경자
/foo bar/im 에서
im은 패턴변경자(pattern modifiers)
i : 대소문자 구분안함
m : 멀티라인
패턴변경자
http://php.net/manual/kr/reference.pcre.pattern.modifiers.php
3. preg_match, preg_replace
preg_match(정규표현식, 문자열) 리턴1:검색됨 0:검색안됨 false:문법적오류
preg_match(정규표현식, 문자열, $matches) : $matches 배열 안에 정규표현식 결과가 담김.
캡쳐링, 역참조 : () 로 정규표현식을 묶어주면 () 로 묶인 구간은 배열에 담겨져 독립된 데이터로 추출해낼 수 있다.
?: 을 붙이면 ()로 묶여있는 구간이 $matches 배열 안에 담기지 않게 된다.
(?:http://) 처럼 사용됨
preg_replace($pattern, $replacement, $string)
$string : 변경하려고 하는 데이터 자체
$pattern : 대상을 찾는 정규표현식 패턴
$replacement : 패턴에서 찾은 대상을 어떻게 변경하는지
$replacement='${1}1, $3'; 에서 ${1}는 [1]번째 하위표현식. $3은[3]번째 하위표현식
print_r : 변수에대한 정보를 사람이 읽기 편하게 출력
1.php
<?php // i는 패턴 매칭을 할 때 대소문자를 구분하지 않도록 한다. //preg_match(정규표현식, 문자열) 리턴1:검색됨 0:검색안됨 false:문법적오류 if(preg_match("/php/i", "PHP is the web scripting language of choice.")){ echo "A match was found."; } else { echo "A match was not found"; } ?>
2.php
<?php /* \b는 단어의 경계를 의미한다. 그렇기 때문에\b로 감싸진 web은 이라는 독립된 단어를 의미한다. */ if(preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")){ echo "A match was found."; #출력됨 } else { echo "A match was not found."; } if(preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")){ echo "A match was found."; } else { echo "A match was not found."; #출력됨 } ?>
3.php
<?php $subject = 'coding everybody http://naver.com egoing@naver.com 010-0000-0000'; //세번째 인자에 변수를 넣으면 변수에 결과를 채움 preg_match('~(http://\w+\.\w+)\s(\w+@\w+\.\w+)~', $subject, $match); //캡쳐링, 역참조 : () 로 정규표현식을 묶어주면 () 로 묶인 구간은 독립된 데이터로 추출해낼 수 있다. //print_r($match); //print_r : 변수에대한 정보를 사람이 읽기 편하게 출력 var_dump($match); echo '<br/>'; echo 'homepage : '.$match[1]; echo '<br/>'; echo 'email : '.$match[2]; ?>
4.php
<?php // get host name from URL preg_match('@^(?:http://)?([^/]+)@i',"http://www.php.net/index.html", $matches); print_r($matches); $host = $matches[1]; //?: 을 붙이면 ()로 묶여있는 구간이 $matches 배열 안에 담기지 않게 됨 //[] 안의 ^는 부정 not 의 의미 //[] 안의 .은 문자 .의 의미 // get last two segments of host name preg_match('/[^.]+\.[^.]+$/',$host,$matches); echo "<br>domain name is : {$matches[0]}\n"; ?>
5.php
<?php $str = 'foobar: 2008'; // () 는 서브패턴 // <>는 연관배열의 형태로 $matches 배열에 저장됨 // Back Reference preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches); /* This also works in PHP 5.2.2 (PCRE7.0) and later, however the above form is recommended for backwards compatibility (?P<name>sub-expression) 은 하위호환성을 위해 대문자 P를 붙임*/ // preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches); print_r($matches); ?>
7.php
<?php $string = 'April 15, 2003'; //변경하려고 하는 데이터 자체 $pattern = '/(\w+) (\d+), (\d+)/i'; //대상을 찾는 패턴 $replacement = '${1}1,$3'; //패턴에서 찾은 대상을 어떻게 변경할지 // ${1} 는 [1]번째 하위표현식. $3은 [3]번째 하위표현식 //preg_match($pattern, $string, $matches); //print_r($matches); echo preg_replace($pattern, $replacement, $string); #April1,2003 ?>
8.php
<?php $string = 'The quick brown fox jumped over the lazy dog.'; $patterns = array(); $patterns[0] = '/quick/'; $patterns[1] = '/brown/'; $patterns[2] = '/fox/'; $replacements = array(); $replacements[2] = 'bear'; $replacements[1] = 'black'; $replacements[0] = 'slow'; echo preg_replace($patterns, $replacements, $string); //배열과 배열을 치환할 수 있다. //여기서 배열은 인덱스가 아니라 생성된 순서대로 이기 때문에 # The bear black slow jumped over the lazy dog.이 출력된다. ?>
9.php
<?php $patterns = array('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/', '/^\s*{(\w+)}\s*=/'); $replace = array('\3/\4/\1\2', '$\1='); // $1 과 ${1}과 \1 은 같은 것으로 배열의 [1]번째를 의미함 echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27'); # $startDate = 5/22/1999 ?>