얕고넓은지식/linux

php 정규 표현식

쪽마 2022. 3. 5. 10:17

정규 표현식

 

문자열에서 특정 패턴을 표현하는 방법으로 정규 표현식이 사용된다. strstr() 과 같은 함수로 특정 패턴을 찾아 낼 수도 있지만 한계가 있다. 정규 표현식을 적절히 사용한다면 다양한 의미를 부여하여 유용하게 쓰일 수 있다.

 

1. .

임의의 한 문자. 줄바꿈 문자(/n)를 제외한 모든 문자를 대신할 수 있다.

예) .at = cat, sat, mat

 

2. \

특수문자 무시. '$', '.', '^' 등의 특수문자를 정규 표현식에서의 특수문자가 아닌 문자 그 자체로 사용하기 위해 사용된다.

예) \$php\! = $php!

 

3. ^

처음에 바로 뒤의 문자열로 시작. 문자열의 맨 앞부분에 이 표현이 있어야 한다.

예) ^com = com, common, computer, compat

 

4. $

마지막에 바로 앞의 문자열로 끝. 이 표현으로 문자열이 끝나야 한다.

예) com$ = .com, abcdcom

 

5. |

OR. 선택을 표현한다.

예) com|edu|net = onlyweis.com, educat, anetb

 

6. ( )

패턴의 시작과 끝

예) co(m){2}on = common

 

7. *

0번 이상 반복.

예) (very )*nice = nice, very nice, very very nice

 

8. +

최소 1번 이상 반복

예) (very )+nice = very nice, very very nice

 

9. { }

횟수 지정의 시작과 끝

예) (very ){2,4} = very very, very very very, very very very very

 

10. ?

없거나 하나인 문자. 하위 표현식을 옵션으로 취급한다.

예) ca?t = ct, cat, abcatd

 

11. [^]

맨 처음 시작되었을 때만 not 의 의미.

예) ca[^t] = ca 다음에 t 가 아니면 true 리턴.

 

12. [-]

글자의 범위를 지정.

예) [a-z] = 알파벳 a 부터 z 까지 지정.

 

13. / /i

패턴 구분자 뒤의 "i" 는 대소문자를 구별하지 않게 한다.

예) "/^[a-z0-9_-]+$/i"
-> 처음부터 끝까지 영(대,소)문자와 숫자, 언더바(_), 하이픈(-) 으로 이루어진 문자열

 

  • php한글체크를 위한 정규표현식 

    $str = "This is 한글" ; 

    if(preg_match("/[\xA1-\xFE][\xA1-\xFE]/", $str)) //true면 한글이 포함되어 있고 false엄따.. 

    echo"한글이 섞여있네.."; 

    }else{ 

    echo"아니면 말고"; 

    } 

    --------------------- 

    정규식으로 한글의 범위는 \xa1-\xfe 로 표현하시면 됩니다. 

    !ereg("^[\xa1-\xfe0-9a-zA-Z]+$",$name) 

    else if(!ereg("^[\xa1-\xfe0-9a-zA-Z]+$",$name)){ 

    echo" 

    <script> 

    window.alert('아이디는 한글과 영문,숫자만 입력할 수 있습니다') 

    history.go(-1) 

    </script> 

    "; 
    출처: http://infoki.net/717

 

1. ^ 와 $ 의 사용의 예

'^' 는 바로 문자뒤의 문자열로 시작 됨을 가르킨다.
"^The" : 는 "The"로 시작 하는 문자를 말한다.

'$' 는 문자열의 맨 마지막을 가르킨다.
"of despair$" : 는 "of despair"로 끝나는 문자열이다.

"^abc$" : 는 hello로 시작해 hello로 끝나는 경우 이므로 "abc" 만 해당된다..


2. '.' '*' '+' '?' 의 사용법

'.' 은 어떤 문자든지 임의의 한문자를 말한다.꼭 하나의 문자가 있어야 한다.
예) "x.z" 는 xyz, xxz, xbz 등이고 xz난 xyyz는 안된다.

'*' 는 바로 앞의 문자가 없거나 하나 이상의 경우를 말한다.
예) "ab*" 는 a, abc, ab, abbbb 등을 말한다.

'+' 는 바로 앞의 문자를 나타내면 꼭 1나 이상이어야 한다.
예) "ab+" 는 abc, abbb 등이고 a는 되지 않는다.

'?' 는 바로 앞의 한문자가 있거나 없는것을 말한다. 단지 한문자 만이어야 한다.
예) "ab?" 는 a 또는 ab 를 나타낸다.


3. [], {} 와 () 그리고 |

3-1 '[]' 는 [] 안에 존재하는 문자들중 한 문자만을 나타낸다.
예) [abc] 는 a 또는 b 또는 c 중에 한문자를 나타낸다. 여기서 '-'를 사용할땐 범위를 나타낸다.
즉 [ a-f ] 는 [abcdf] 와 같은것을 나타낸다.
문자클래스 오퍼레이터라는 것에 대해 잠시..
유사한 성격의 문자들을 사용자가 알아보기 쉽게 단어로 그룹을 지었다고 보면 된다.

alnum : 알파벳과 숫자
alpha : 알파벳
blank : 스페이스나 탭 (시스템에 의존적임)
cntrl : 아스키코드에서의 127 이상의 문자와 32 이하의 제어문자
(한글의 첫째바이트가 127 이상이므로 제어문자로 취급됨 :()
digit : 숫자
graph : 스페이스는 제외되고 나머지는 'print' 항목과 같음.
lower : 소문자
print : 아스키코드에서 32에서 126까지의 찍을 수 있는 문자
punct : 제어문자도 아니고 알파벳.숫자도 아닌 문자
space : 스페이스, 케리지 리턴, 뉴라인, 수직 탭, 폼피드
upper : 대문자
xdigit : 16진수, 0-9, a-f, A-F

[[:alnum:]]은 [a-zA-Z0-9] 와 같은 의미다.
[[:alpha:]]은 [a-zA-Z] 와 같은 의미다.
문자열 오퍼레이터는 [] 사이에서만 효력을 발휘한다.
그리고 반대의 의미도 가능하다.
[^[:alnum:]] 은 알파벳과 숫자의 조합이 아닌것을 말한다.
[^a-zA-Z0-9] 와 같이 사용될수도 있다.



'3-2 {}'는 {} 앞에 있는 문자나 문자열의 개수를 정하는 것이다.

예) "ab" 는 "abb"를 나타낸다. 즉 b의 개수가 2개를 나타낸다.
"ab{2,}" 는 abb, abbbbb 등 b의 개수가 2개 이상을 나타낸다.
"ab{3,5}" 는 abbb, abbbb, abbbbb 와 같이 b가 3개에서 5개 까지를 나타낸다.


3-3 '()' 는 ()안에 있는 글자들을 그룹화 한다.

예) a(bc)* 는 a, abc abcbc 등 'bc'가 없거나 하나 이상인 경우이다.
"a(bc)" 는 abcbc 를 나타낸다.


3-4 '|' 는 OR 연산자 기능을 한다.

"a|b" 는 a 또는 b 둘중 하나를 나타낸다.

참고할것은 기호인데 이것은 . (, ) 등 단지 다음에 오는것이 문자라는것을
의미한다. 어떤한 처리도 없이 문자로만 인식한다.
{1,3} 하고 하면 {1,3} 와는 다르다.

4. 기초 활용

"a(bc)*" 는 a라는 문자를 포함하고 bc라는 문자열이 없거나 계속반복되는 문자열이다.
이것은 a, abc ,abcbc abcbcbc.... 등의 문자열을 의미한다.

"a(bc){1,5}" 는 a 라는 문자를 포함하고 bc 라는 문자를 묶은 형태인데. bc 라는 문자가
한번에서 5번까지를 말한다. --말이 더 어렵다....
이것은 abc,abcbc,abcbc,abcbcbc,abcbcbcbc,abcbcbcbcbc 의 문자열을 의미한다.

^[1-9][0-9]*$ 는 자연수를 표시할수 있다.
^(0|[1-9][0-9]*)$ 는 0을 포함하는 자연수
^(0|-?[1-9][0-9]*)$ 정수표시
^[0-9]+(.[0-9]+)?$ 소숫점 표시
^[0-9]+(.[0-9])?$ 소수점 둘째자리 까지
^[0-9]+(.[0-9]{1,2})?$ 소수점 둘째자리나 첫째자리
^[0-9]{1,3}(,[0-9])*(.[0-9]{1,2})?$ 돈의 표시...
(센트까지 표시가능 예 2,200.20 : 이천이백이십센트 또는 이천이백이십전 맞나?)

5. 복합활용

5-1 메일 주소 체킹..

5-1-1 : 유저명@도메인명

유저명 : 대문자, 소문자, 숫자 그리고 '.' '-' '_' 을 가질 수있지만 . 로 시작해서는 안된다.
[_0-9a-zA-Z-]+(.[_0-9a-zA-Z]+)*
이때에는 eregi 를 사용할때까 아닌 ereg 를 사용할때이다. eregi 함수는 대소문자구분이 없다.
^[_a-z0-9-]+(.[_a-z0-9-]+)*$ eregi 함수를 사용할때...

5-1-2 : 도메인 : 유저명과 기본적으로는 같지만 _ 가 없다.
^[a-z0-9-]+(.[a-z0-9-]+)*$

5-1-3 : 메일 주소 체킹
위의 것의 조합이다.

^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$

5-2 URL 에 http:// 붙여주기

URL 은 대문자, 소문자, 숫자 ,'.','_','=','&','?','~','@','/','+' 를 사용 할수 있다
 http://([0-9a-zA-Z./@~?&=_]+) 가 된다.


$add="www.codelib.co.kr";
$pattern ="([0-9a-zA-Z./@~?&=_]+)";
$link =ereg_replace($pattern, "http://1" $add);
echo ("$link");

의 결과 $link 는 다음처럼 변경 된다.
http://www.codelib.co.kr
와 같이 된다. 참고로 1 은 첫번째 괄호안의 값을 말한다. 2는 2번째..

몇가지 복잡한 정규표현식을 풀다보면 이해하는데 도움이 될것이다 '  

출처 : koreaphp.co.kr

------------------------------------------------------------------

Regular Expressions

  1. 문자 집합 : [] - 대괄호 사이에 찾고자 하는 문자들의 집합을 표기한다
    • 예)
      • [0-9] : 0부터 9까지의 숫자 한 문자
      • [Aa] : A 혹은 a에 대응하는 한 문자
    • "-"(하이픈)은 문자 집합인 대괄호 안에서 만 문자의 범위를 지정하는 기호로 쓰인다.
  2. 제외 문자 : ^ (캐럿) - ^기호 뒤의 문자를 제외한 문자 (집합기호 - [] - 안에서 쓰일때)
    • 예)
      • ns[^0-9] : nsx - ns다음의 x가 숫자가 아닌 한 문자에 대응
  3. 메타 문자 : 정규표현식에서 특별한 의미를 가지는 문자
    • 정규표현식에서 메타문자 및 기호문자를 찾고자하는 문자에 대응하려면 "\"(escape)를 붙혀 사용한다.
    • 모든 문자 : .(마침표) - 모든 문자에 대응되는 한 문자
    • 공백 문자 : \n, \r, \t, \f-form feed, \v-vertical tab
    • 특별한 문자 형태
      • 숫자와 숫자 아닌문자 : \d - [0-9], \D - [^0-9]
      • 영숫자 문자와 영숫자 문자가 아닌 문자 : \w - [a-zA-Z0-9_], \W - [^a-zA-Z0-9_]
      • 공백문자와 공백이 아닌문자 : \s - [\f\n\r\t\v], \S - [^\f\n\r\t\v]
      • 16진수 8진수 : \x, \0
  4. 반복찾기
    • + : 한 문자 이상 - + 기호 앞으 문자가 하나 이상 반복
    • * : 문자가 없거나 하나 이상 반복
    • ? : 문자가 없거나 하나와 대응하는 문자   예) https?// - s가 없거나 한번 있는 경우와 대응
  5. 반복회수 지정하기 : {} (중괄호) - 중괄호 앞의 문자에 대하여 반복회수 지정
    • 반복회수 지정 : {반복회수} - 저정된 회수만큼 반복하는 경우 대응
      • 예)
        • #[0-9A-Fa-f]{6} - 16진수 RGB표기
    • 최소, 최대 반복회수 지정 : {최소, 최대} - 최소번 또는 최대번만 반복되는 경우 대응, 최소값에 0과 최대값의 생략 가능
      • 예)
        • \d{1,2}[-\/]\d{1,2}[-\/]\d{2,4} - -또는 / 구분의 날짜 표기
  6. greedy와 lazy 수량자
    • 탐욕적 수량자 : +, *, {n,}
    • 게으른 수량자 : +?, *?, {n,}?
    • 예) abcd <b>xxx</b> and <b>yyy</b> efgh
      • greedy : <[Bb]>.*</[Bb]> --> <b>xxx</b> and <b>yyy</b>
      • lazy : <[Bb]>.*?</[Bb]> --> <b>xxx</b> 와 <b>yyy</b>
  7. 단어 경계 지정
    • 단어 사이의 공백 : \b - 공백문자(space)와 일치하지만 공백을 일치하는 문자로 지정하지는 않는다. (\B - \b와 반대) --> 단어 사이의 구분자로 쓰임
      • 실제 공백 문자를 찾을 때는 [ ]또는 \s를 활용한다.
    • 시작 문자 지정 : ^(캐럿) - 제외 문자와 달리 표현식의 처음에 사용되어 다음에 나오는 문자를 시작하는 문자로 지정할 수 있다.
    • 마지막 문자 지정 : $ - 앞에 나온 문자가 마지막에 일치할때
    • 다중행 모드 : (?m)
      • 지정한 문자열을 줄단위로 분리하여 표현식을 검색한다.
      • 표현식의 가장 앞에 써준다.
      • 다중행 모드 지정시 ^와 $를 지정단 문자열의 줄단위로 검색하는 것이 가능하다.
    • 예) 라인단위 주석(//) 문자로 부터 해당 라인의 끝까지
      • (?m)^//.*$
  8. 하위 표현식 : () - 괄호
    • 표현식 일부를 괄호로 묶어준다.
    • 중첩 하위 표현식 : 괄호안에 괄호...
    • or 연산자 : | - | 기호의 좌우 둘중 하나가 일치하는 경우
    • 예) 아이피 형식의 문자열
      • (\d{1,3}\.){3}\d{1,3}
      • (((\d{1,2})|(1\d{2}))|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2}))|(2[0-4]\d)|(25[0-5]))
  9. 역참조 : \1 ~ \9
    • 표현식 중 하위 표현식의 순서와 지정한 번호가 해당 하위 표현식과 일치한다.
    • 0번을 지정하면 해당 표현식 전부와 일치한다.
    • 예) html의 <H1~6>태그의 내용 찾기
      • <Hh([1-6])>.*?</Hh\1>
  10. 전방탐색과 후방탐색 : 하위표현식으로 표현
    • 전방탐색 : ?= - 지정한 전방 탐색 기호의 다음 표현식으로 부터 앞에 나오는 일치하는 문자를 찾는다.
    • 후방탐색 : ?<= - 지저한 후방 탐색 기호의 다음 표현식으로 부터 뒤에 나오는 일치하는 문자를 찾는다.
    • 예) html tag기회 내의 내용
      • (?<=<[Tt][Ii][Tt][Ll][Ee]>).*?(?=</[Tt][Ii][Tt][Ll][Ee]>)
    • 부정형 전/후방 탐색 : 전방 - ?!, 후방 - ?<!
      • 예) $로 시작하지 않는 숫자
        • \b(?!\$)\d+\b
  11. 조건 달기 : ?
    • ? 앞의 문자(표현식)가 없거나 한번 일치할때 해당하는 앞으 문자(표현식)과 일치한다.
    • 전후방 탐색(?=, ?<=)의 뒤에 나오는 표현식과 일치할때...
    • 역참조 조건 : (?(backreference)true), (?(backreference)true|false)
      • backreference는 역참조 대상의 하위 표현식이며, \를 붙이지 않고 해당 하위 표현식 순서에 해당하는 번호를 지정한다.
        • 예) IMG 태그나 이미지 태그를 싸고 있는 A태그
          • (<[Aa]\s+[^>]+>\s*)?<[Ii][Mm][Gg]\s+[^>]+>(?(1)\s*</[Aa])>)
        • 예)
          • (\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
    • 전방 탐색 조건 : (?(?=condition)expressions)
      • 예)
        • \d{5}(?(?=-)-\d{4})

* 유용한 정규 표현식 예

- IP : (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))

- URL : https?://(\w*:\w*@)?[-\w.]+(:\d+)?(/([\w/_.]*(\?\S+)?)?)?

- Email : (\w+\.)*\w+@(\w+\.)+[A-Za-z]+

- HTML 주석 : <!-{2,}.*?-{2,}>

- 주민등록번호 : \d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])-[1-4]\d{6}

- 한글 : [가-힣]

- 유니코드 : \ucodenumber

[출처] 정규표현식|작성자 승현아빠

 

-------------------------------------------------------------------------------------------------

손에 잡히는 정규표현식 정리

 

·         2장 문자 하나 찾기

o    마침표(.)은 어떠한 문자나 알파벳, 숫자, 심지어는 문장 부호로 쓰인 마침표(.) 자체와도 일치한다.

o    대다수의 정규 표현식 구현에서 마침표(.)은 줄바꿈 문자를 제외한 모든 문자와 일치한다.

o    역슬래시(\)는 문자들이 문자 그대로 해석되게 하며(이스케이프), 특수한 문자 시퀀스를 시작하는데 사용된다.

·         3장 문자 집합으로 찾기

o    메타 문자인 대괄호([ ])를 사용해 문자 집합을 표현한다.

o    대괄호([ ])안에 있는 문자는 모두 집합의 구성원이 되며, 집합에 속한 문자 가운데 하나가 일치한다.

o    얻고자 하는 결과와 패턴이 일치하는지 확인하는 일은 매우 쉽지만, 진짜 도전과제는 얻고 싶지 않은 결과도 일치하는지 확인하는 일이다.

o    문자 범위를 단순하게 만들 때 정규 표현식에서는 특별한 메타 문자인 하이픈(-)을 제공한다.

o    A-z 패턴은 사용하지 않도록 하자.

§  Z a사이에 속하는 아스키 문자 중에는 여는 대괄호( [ )와 캐럿(^)과 같은 문자도 포함되기 때문이다.

o    범위를 지정할 때는 두 값 중 더 큰 값이 앞에 나오면 안 된다.

o    하이픈(-)은 대괄호([ ])안에서만 메타 문자인 특수한 메타 문자이다.

§  집합 밖에서 하이픈(-)은 단순한 문자 그대로 하이픈(-)과 일치한다.

§  집합 밖에서는 하이픈(-) 문자에 굳이 역슬래시(\)를 붙일 필요가 없다.

o    캐럿(^)문자는 제외할 문자 집합을 지정한다.

§  캐럿(^)문자는 이 문자 바로 뒤에 있는 문자나 범위뿐만 아니라 집합 안에 있는 문자나 범위를 모두 제외한다.

·         4장 메타 문자 사용하기

o    공백 메타 문자

 

메타 문자 설명
[\b] 역스페이스
\f 페이지 넘김(form feed)
\n 줄바꿈
\r 캐리지 리턴
\t
\v 수직 탭

 

o   \r\n은 줄바꿈과 캐리지 리턴의 조합과 일치한다.

§  윈도우에서 이 조합은 줄의 끝을 나타내는데 사용한다.

§  유닉스와 리눅스에서는 단순히 줄바꿈 문자만 사용한다.

o    숫자 메타 문자

 

메타 문자 설명
\d 숫자 하나([0-9]와 같다)
\D 숫자를 제외한 문자 하나([^0-9]와 같다.)

o   정규 표현 문법은 대소문자를 구별한다. 소문자와 대문자는 서로 반대임을 뜻한다.

o    영숫자 메타 문자

 

메타 문자 설명
\w 대소문자와 밑줄을 포함하는 모든 영숫자([a-zA-Z0-9_]와 같다)
\W 영숫자나, 밑줄이 아닌 모든 문자([^a-zA-Z0-9_]와 같다)

o    공백 메타 문자

 

메타 문자 설명
\s 모든 공백 문자([\f\n\r\t\v]와 같다)
\S 공백 문자가 아닌 모든 문자([^\f\n\r\t\v]와 같다)

o   \s \S에 역스페이스 메타 문자인[\b]는 포함되지 않는다.

o    포직스 문자 클래스

 

분류 내용
[:alnum:] 모든 영숫자([a-zA-Z0-9]와 같다)
[:alpha:] 모든 영문자([a-zA-Z]와 같다)
[:blank:] 빈칸(space)이나 탭 문자([\t]와 같다)
[:cntrl:] 아스키 제어문자(아스키 0번부터 31, 127)
[:digit:] 모든 한 자리 숫자([0-9]와 같다)
[:graph:] [:print:]와 동일하나 빈칸(space)은 제외
[:lower:] 모든 소문자([a-z]와 같다)
[:print:] 출력 가능한 모든 문자
[:punct:] [:alnum:]이나 [:cntrl:]가 포함되지 않은 모든 문자
[:space:] 빈칸을 포함한 모든 공백 문자([\f\n\r\t\v]와 같다)
[:upper:] 모든 대문자([A-Z]와 같다)
[:xdigit:] 모든 16진수 숫자([a-fA-F0-9]와 같다)

o   포직스 문자 클래스는 줄여 쓰기를 나타내는 또 다른 형태인데, 전부는 아니지만 많은 정규 표현식에서 구현을 지원한다.

o   자바스크립트는 정규 표현식에서 포직스 문자 클래스를 지원하지 않는다.

 

·         5장 반복 찾기

o    문자나 집합에 속한 요소(instance)를 하나 이상 찾으려면 간단히 문자 뒤에 더하기(+)문자를 붙이면 된다,

§  문자 집합에 더하기(+)를 사용할 때는, 더하기(+)를 집합 바깥에 두어야 한다.

§  , [0-9+]가 아니라 [0-9]+ 가 맞는 표현이다.

§  더하기(+)는 하나 이상 연속된 문자를 찾는다. 따라서 최소한 하나는 일치해야 한다.

o    있을 수도 있고 없을 수도 있는 문자와 일치시키려면 메타 문자인 별표(*)를 사용한다.

§  별표(*)는 문자나 집합이 없는 경우 또는 하나 이상 연속하는 경우에 일치한다.

o    특정한 문자 하나만 찾을 때는 메타 문자인 물음표(?)를 사용한다.

o    [\r]?\n

§  유닉스나 리눅스 환경에서는 \r은 제외하고 \n만 사용하므로 이에 대한(줄바꿈) 정규표현식이다.

o    구간은 중괄호({ })안에 표시한다.

o    문자나 일치하는 수를 정확히 정하려면 여는 중괄호( { )와 닫는 중괄호( } ) 사이에 숫자를 넣는다.

o    일치시키려는 요소(instance)의 최소값과 최대값을 나타낼 때도 구간을 사용한다.

§  {2,4}는 최소 두번에서 최대 4번을 뜻한다.

o    최소 구간 찾기

§  구간 검색은 최대값 없이 찾고자 하는 요소의 최소값을 지정할 수도 있다.

§  {3,}은 최소 3번 일치함을 의미한다.

§  최소값으로 구간을 찾을 때는 주의해야 한다. 만약 쉼표(,)가 빠지면 요소의 최소값이 아니라 정확히 지정한 만큼 일치시키는 것으로 인식한다.

o    과하게 일치하는 상황 방지하기(탐욕적 수량자)

§  별표(*)와 더하기(+)같은 메타 문자가 탐욕적(greedy)이기 때문에 이는 가능한 한 가장 큰 덩어리를 찾으려 한다.

§  이런 메타문자는 찾으려는 텍스트를 앞에서부터 찾는 게 아니라, 텍스트 마지막에서 시작해서 거꾸로 찾는다.

§  이는 의도적으로 수량자(quantifier)를 탐욕적으로 설계했기 때문이다.

§  이에 대한 반대 기능은 수량자를 게으른(lazy) 수량자로 바꿔 해결한다.

§  탐욕적 수량자와 게으른 수량자

 

탐욕적 수량자 게으른 수량자
* *?
+ +?
{n,} {n,}?

·         6장 위치찾기

o    위치 찾기(position matching)는 텍스트 문자열 안에서 반드시 일치해야 하는 위치를 지정할 때 사용한다.

o    단어 경계 지정하기(\b로 표시하는 단어 경계)

§  \b는 단어의 시작이나 마지막을 일치시킬 때 사용한다.

§  완전한 단어 하나를 일치시키고자 한다면, 일치시키고자 하는 단어 앞뒤에 모드 \b를 붙인다.

§  \b는 실제로 문자와 일치하는 것이 아니고, 위치를 가리킨다.

§  특별히 단어 경계와 일치시키고 싶지 않을 땐, \B를 사용한다.

o    문자열 경계 정의하기

§  문자열 경계는 메타 문자 가운데 캐럿(^)으로 문자열의 시작을, 달러기호($)로 문자열의 마지막을 나타낸다.

§  캐럿(^)문자는 여러 용도로 쓰는 몇몇 메타 문자 중의 하나이다.

§  대괄호([ ])로 둘러싸인 집합 안에서는 여는 대괄호( [ )문자 바로 다음에 쓰면 부정을 뜻한다.

§  집합 밖에서는 패턴 시작 부분에 캐럿(^)문자를 쓰면 문자열의 시작 부분과 일치한다.

o    .*는 텍스트가 없는 경우도 포함하여 둘 사이에 있는 모든 텍스트와 일치한다.

o    다중행 모드 사용하기

§  많은 정규 표현식 구현은 다른 메타 문자의 동작을 변경하는 특수한 메타 문자를 지원하는 데 그 중 하나가 (?m)으로, 다중행(multiline)을 지원한다.

§  다중행 모드로 변경하면 강제로 정규 표현식 엔진이 줄바꿈 문자를 문자열 구분자로 인식한다.

§  캐럿(^)은 문자열의 시작이나 줄바꿈 다음(새로운 행)에 나오는 문자열의 시작과 일치

§  달러 기호($)는 문자열의 마지막이나 줄바꿈 다음에 나오는 문자열의 마지막과 일치

§  (?m)은 항상 패턴 제일 앞에 두어야 한다.

§  (?m)을 지원하지 않는 정규 표현식 구현도 많다.

·         7장 하위표현식 사용하기

o    하위 표현식은 큰 표현식 안에 속한 일부 표현식을 한 항목으로 다루도록 한데 묶은 것이다.

o    하위 표현식은 괄호 사이에 사용한다.

o    어떤 사용자들은 가독성을 높이고자 표현식 일부를 하위표현식으로 묶기도 하는데, 이는 사용하는 정규 표현식 구현에 따라 성능 문제가 발생할 수도 있다.

o    OR( | ) 연산자

§  묶음 안에서 하나를 일치시키고자 할 때

o    IP주소를 구성하는 각 숫자 묶음을 유효한 조합으로 정의하는 규칙

§  모든 한 자리 혹은 두 자리 숫자

§  1로 시작하는 모든 세자리 숫자

§  2로 시작하면서 두 번째 자리 숫자가 0부터 4사이의 모든 세 자리 숫자

§  25로 시작하면서 세 번째 자리 숫자가 0부터 5사이의 모든 세 자리 숫자

§  (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))

 

 

·         8장 역참조 사용하기

o    역참조는 정규 표현식 패턴으로, 앞서 일치한 부분을 다시 가리킨다.

o    역참조를 변수와 비슷하게 생각해도 된다.

o    예제)

[ ]+(\w)[ ]+\1

o   [ ]+는 공백이 하나 이상 연속되는 경우 일치하고, \w+는 영숫자 문자가 하나 이상 연속되는 경우 일치하며, [ ]+는 그 뒤에 공백이 있을 때 일치한다.

o   여기서, \1은 앞서 일치한 하위 표현식을 참조함을 의미한다. 따라서, (\w+)와 일치하는 문자는 \1과도 일치한다.

o    자바스크립트는 역참조를 표시할 떄 역슬래시(\)를 사용하는데, 펄은 달러기호($)를 사용한다.

o    역참조는 참조하는 표현식이 하위 표현식일 때만 동작한다.

o    많은 구현에서 0번째 참조라고 하면 표현식 전체를 가리킨다.

o    치환 작업 수행하기

§  정규표현식을 써 치환하는 작업은 역참조와 함께 사용했을 떄 진가를 발휘한다.

§  예제)

정규표현식 : (\w+[\w\.]*@[\w\.]+\.\w+)

치환 : <A HREF="mailto:$1">$1</A>

o    첫 패턴에서 일치한 하위 표현식을 두 번째 패턴에도 썼다.

o    대소문자 치환하기

§  대소문자 변환 메타 문자

 

메타 문자 설명
\E \L 혹은 \U 변환의 끝을 나타낸다.
\l 다음에 오는 글자를 소문자로 변환한다.
\L \E를 만날 때까지 모든 문자를 소문자로 변환한다.
\u 다음에 오는 글자를 대문자로 변환한다.
\U \E를 만날 때까지 모든 문자를 대문자로 변환한다.

o    \l \u는 바꾸고 싶은 글자 앞에 두어 각각 그 글자를 소문자와 대문자로 바꾼다.

o    \L \U \E를 만날 때까지 모든 문자를 각각 소문자와 대문자로 변환한다.

o   예제)

§  정규표현식 : (<[Hh1>)(.*?)(</[Hh1>)

§  치환 : $1\U$2\E$3

o    역참조는 텍스트를 검색하고(match), 치환하는 데 매우 유용하다.

 

·         9장 전방탐색과 후방탐색

o    전방탐색은 모든 주요 정규 표현식 구현에서 지원하지만, 후방탐색은 광범위하게 지원하지 않는다.

o    전방탐색 - 앞으로 찾기

§  전방탐색(lookahead)패턴은 일치 영역을 발견해도 그 값을 반환하지 않는 패턴을 말한다.

§  전방탐색은 실제로는 하위 표현식이며, 하위 표현식과 같은 형식으로 작성한다.

§  전방탐색 패턴의 구문은 ?=으로 시작하고 등호(=) 다음에 일치하는 텍스트가 오는 하위 표현식이다.

§  예제)

.+(?\:)

o    ?= 정규 표현식 엔진에게 콜론(:)을 찾되 콜론(:) 앞에 있는 문자를 찾으라고(소비는 하지 말고) 지시한다.

o    일부 정규표현식 문서에서는 일치하는 영역을 반환하는 동작을 표현할 때 '소비한다(consume)'라는 용어를 쓴다.

o   모든 하위 표현식 앞쪽에 단순히 ?=를 붙이기만 하면 전방탐색 표현으로 바꿀 수 있다.

o   하나의 검색 패턴 속에서 여러 개의 전방탐색 표현식을 사용할 수 있고, 또한 그 표현식은 패턴 안에서 어느 위치에서든 사용할 수 있다.

o    후방탐색 - 뒤로 찾기

§  후방탐색 연산은 ?<=이다.

§  전방탐색 패턴은 마침표(.)와 더하기(+)를 포함하여 텍스트의 길이를 다양하게 일치시킬 수 있으며, 매우 동적이다.

§  반대로 후방탬색 패턴은 보통 일치시킬 텍스트의 길이를 고정해야 한다.

§  거의 모든 정규 표현식 구현에는 이런 제약이 있다.

o    부정형 전후방탐색

§  부정형(negative) 전후방탐색은 비교적 덜 쓰는 방법이다.

§  부정형 전방탐색은 앞쪽에서 지정한 패턴과 일치하지 않는 텍스트를 찾고,

§  부정형 후방탐색도 이와 비슷하게, 뒤쪽에서 지정한 패턴과 일치하지 않는 텍스트를 찾는다.

§  전후방탐색 명령

 

종류 설명
(?=) 긍정형 전방탐색
(?!) 부정형 전방탐색
(?<=) 긍정형 후방탐색
(?<!) 부정형 후방탐색

·         10장 조건 달기

o    모든 정규 표현식 구현에서 조건 처리를 지원하지는 않는다.

o    정규 표현식 조건은 물음표(?)를 사용해 정의한다.

§  (?(backreference)true)

§  물음표(?)로 조건을 시작하고, 괄호 안에 역참조를 지정한 다음, 역참조가 존재하는 경우에만 평가될 표현식이 바로 뒤에 나온다.

§  예제)

(<[Aa]\s+[^>]+>\s*)?<[Ii][Mm][Gg]\s+[^>]+>(?(1)\s*</Aa]>)

o    ?(1)은 역참조 1(<A>시작 태그)이 있을 때만 수행하라는 말이다.

o    다른 말로, 태그<A>와 일치한다면 그 뒤의 종료 태그도 일치시키라는 뜻이다.

o    ?(1)은 역참조 1이 있는지 없는지를 검사한다. 역참조 번호를 조건에서 이스케이프 할 필요는 없다.

o    , ?(1)이 맞고, ?(\1)은 잘못된 것이다. 그렇지만 후자도 동작한다.

o   (?(backreference)true|false)

o    전후방 탐색 조건

§  전후방탐색 조건은 전방탐색과 후방탐색 명령이 성공했는지에 따라 표현식을 수행할지 결정한다.

§  전후방탐색 조건은 역참조(괄호안에 넣는 숫자)가 완전히 전후방탐색 표현식으로 대체되었다는 점만 빼고는 역참조 조건과 동일하다.

§  예제)

\d{5}(?(?=-)-\d{4})

o    하이픈이 있다는 조건을 만족하면, -\d{4}는 그 하이픈과 이어 나오는 숫자 네 개와 일치한다.

o   더 간단한 방법으로 비슷한 결과를 얻을 수 있기 때문에 전후방탐색 조건은 자주 사용하지 않는다.

 

출처: http://cafe.naver.com/happinessfactory/1633

 

예1) 마지막 숫자만 추출

$buff = Array(
    "/Senderror.jsp?plno=1367353074&modelno=10829037&",
    "/Senderror.jsp?plno=1367353074&modelno=182345531&",
    "/Senderror.jsp?plno=1367353074&modelno=335114444&",
    "/Senderror.jsp?plno=1367353074&modelno=5411214112&"
);

foreach($buff as $str){
    preg_match("/=(\d+)&$/", $str, $match);  //"="시작해서 숫자가 1개 이상 있고 &로 끝나는 문자열 추출
    echo $match[1]."<br />";
}

반응형