PHP & Others

정규표현식

페이지 정보

본문

정규표현식 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이 있는지 찾고, 만약 해당되는 것이 있다면 그 결과는 제외한다.

 

 

그외

[] 안의 .은 임의의 문자가 아니라 문자 . 을 의미한다

 

 



정규표현식 결과 확인 사이트

http://regexr.com/

 

정규표현식을 시각화해서 보여주는 사이트

https://regexper.com/

 

 

블로그 링크 - 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

?>

[출처] php 정규표현식|작성자 바작


관련자료

등록된 댓글이 없습니다.
Today's proverb
유쾌한 사람은 자기 일에만 몰두하는 사람이 아니다. 때론 자신의 일을 전부 제쳐놓고 타인의 문제에 전력을 쏟는 열정이 있는 사람이다. 타인에게 자신의 힘을 나누어주고 마음을 열어주는 것은 자신의 삶을 행복하게 만드는 방법이다.