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 정규표현식|작성자 바작


관련자료

댓글 0
등록된 댓글이 없습니다.
Today's proverb
사랑의 계산 방법은 독특하다. 절반과 절반이 합쳐 하나가 되는 것이 아니라,오직 두 개가 모여 완전한 하나를 만들기 때문이다. (조 코데르트)