정규 표현식
문자열에서 특정 패턴을 표현하는 방법으로 정규 표현식이 사용된다. 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
- 문자 집합 : [] - 대괄호 사이에 찾고자 하는 문자들의 집합을 표기한다
- 예)
- [0-9] : 0부터 9까지의 숫자 한 문자
- [Aa] : A 혹은 a에 대응하는 한 문자
- "-"(하이픈)은 문자 집합인 대괄호 안에서 만 문자의 범위를 지정하는 기호로 쓰인다.
- 예)
-
제외 문자 : ^ (캐럿) - ^기호 뒤의 문자를 제외한 문자 (집합기호 - [] - 안에서 쓰일때)
-
예)
-
ns[^0-9] : nsx - ns다음의 x가 숫자가 아닌 한 문자에 대응
-
-
- 메타 문자 : 정규표현식에서 특별한 의미를 가지는 문자
- 정규표현식에서 메타문자 및 기호문자를 찾고자하는 문자에 대응하려면 "\"(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
- 반복찾기
- + : 한 문자 이상 - + 기호 앞으 문자가 하나 이상 반복
- * : 문자가 없거나 하나 이상 반복
- ? : 문자가 없거나 하나와 대응하는 문자 예) https?// - s가 없거나 한번 있는 경우와 대응
- 반복회수 지정하기 : {} (중괄호) - 중괄호 앞의 문자에 대하여 반복회수 지정
- 반복회수 지정 : {반복회수} - 저정된 회수만큼 반복하는 경우 대응
- 예)
- #[0-9A-Fa-f]{6} - 16진수 RGB표기
- 예)
- 최소, 최대 반복회수 지정 : {최소, 최대} - 최소번 또는 최대번만 반복되는 경우 대응, 최소값에 0과 최대값의 생략 가능
- 예)
- \d{1,2}[-\/]\d{1,2}[-\/]\d{2,4} - -또는 / 구분의 날짜 표기
- 예)
- 반복회수 지정 : {반복회수} - 저정된 회수만큼 반복하는 경우 대응
- 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>
- 단어 경계 지정
- 단어 사이의 공백 : \b - 공백문자(space)와 일치하지만 공백을 일치하는 문자로 지정하지는 않는다. (\B - \b와 반대) --> 단어 사이의 구분자로 쓰임
- 실제 공백 문자를 찾을 때는 [ ]또는 \s를 활용한다.
- 시작 문자 지정 : ^(캐럿) - 제외 문자와 달리 표현식의 처음에 사용되어 다음에 나오는 문자를 시작하는 문자로 지정할 수 있다.
- 마지막 문자 지정 : $ - 앞에 나온 문자가 마지막에 일치할때
- 다중행 모드 : (?m)
- 지정한 문자열을 줄단위로 분리하여 표현식을 검색한다.
- 표현식의 가장 앞에 써준다.
- 다중행 모드 지정시 ^와 $를 지정단 문자열의 줄단위로 검색하는 것이 가능하다.
- 예) 라인단위 주석(//) 문자로 부터 해당 라인의 끝까지
- (?m)^//.*$
- 단어 사이의 공백 : \b - 공백문자(space)와 일치하지만 공백을 일치하는 문자로 지정하지는 않는다. (\B - \b와 반대) --> 단어 사이의 구분자로 쓰임
- 하위 표현식 : () - 괄호
- 표현식 일부를 괄호로 묶어준다.
- 중첩 하위 표현식 : 괄호안에 괄호...
- 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]))
- 역참조 : \1 ~ \9
- 표현식 중 하위 표현식의 순서와 지정한 번호가 해당 하위 표현식과 일치한다.
- 0번을 지정하면 해당 표현식 전부와 일치한다.
- 예) html의 <H1~6>태그의 내용 찾기
- <Hh([1-6])>.*?</Hh\1>
- 전방탐색과 후방탐색 : 하위표현식으로 표현
- 전방탐색 : ?= - 지정한 전방 탐색 기호의 다음 표현식으로 부터 앞에 나오는 일치하는 문자를 찾는다.
- 후방탐색 : ?<= - 지저한 후방 탐색 기호의 다음 표현식으로 부터 뒤에 나오는 일치하는 문자를 찾는다.
- 예) html tag기회 내의 내용
- (?<=<[Tt][Ii][Tt][Ll][Ee]>).*?(?=</[Tt][Ii][Tt][Ll][Ee]>)
- 부정형 전/후방 탐색 : 전방 - ?!, 후방 - ?<!
- 예) $로 시작하지 않는 숫자
- \b(?!\$)\d+\b
- 예) $로 시작하지 않는 숫자
- 조건 달기 : ?
- ? 앞의 문자(표현식)가 없거나 한번 일치할때 해당하는 앞으 문자(표현식)과 일치한다.
- 전후방 탐색(?=, ?<=)의 뒤에 나오는 표현식과 일치할때...
- 역참조 조건 : (?(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}
- 예) IMG 태그나 이미지 태그를 싸고 있는 A태그
- backreference는 역참조 대상의 하위 표현식이며, \를 붙이지 않고 해당 하위 표현식 순서에 해당하는 번호를 지정한다.
- 전방 탐색 조건 : (?(?=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 />";
}
'얕고넓은지식 > linux' 카테고리의 다른 글
리눅스 현재폴더 데이터 상위파일로 모두 이동 (0) | 2023.02.11 |
---|---|
리눅스 curl 설치 확인방법 (0) | 2022.12.18 |
mysql 특정 단어 포함 게시글 행 삭제 (0) | 2022.04.10 |
리눅스 파일내에 단어치환 (0) | 2022.03.20 |
인덱스(index) 페이지에 특정 게시판 리스트로 하기 게시판 첫화면 리스트로 amina (0) | 2022.03.08 |
php 정규식 태그제거 (0) | 2022.03.05 |
phpmyadmin mysql 그누보드 내용찾아 바꾸기 (0) | 2022.02.26 |
ubuntu 20.04 웹서버 한방에 따라하기 3 phpmyadmin 설치하기 및 root 접속하기 (4) | 2022.02.06 |
ubuntu 20.04 웹서버 한방에 따라하기 2 가상호스트 설정 (0) | 2022.02.05 |
ubuntu 20.04 웹서버 한방에 따라하기 (0) | 2022.02.05 |