2006년 10월 13일 금요일

Regular Expressions.. 정규식..

알아두면 너무 편리한 에디트 플러스에서 사용하는 정규식..

잃어버리기 전에 하나씩 메모..


^ 는 라인의 제일 처음을 말한다.

$ 는 정규식에서 라인의 제일 마지막을 말한다. (주위 : 원래 ^, $ 는 정규식에서 데이터의 시작과 끝을 의미)

| 는 and를 의미한다. 이 기호의 양쪽에 있는 두 글자를 모두 찾습니다. (ex. java|jsp|servlet)

\t 탭 문자를 찾습니다.

\n 줄 바꿈 문자를 찾습니다

. 모든 문자를 찾습니다.

[] 대괄호 범위의 모든 문자를 찾습니다.  (ex. "[ab]" 는 "a"와 "b"를 모두 찾습니다. "[a-z]" a부터 z까지입니다.)
      - 한글검색: 한글의 범위는 "ㄱ-ㅎ, 가-힣" 입니다.

[^] 대괄호 범위의 모든 문자를 제외한 문자를 찾습니다. (ex. "[^a-z]" a~z까지의 문자를 제외합니다.)
            - 주의: 괄호안에서 ^와 괄호밖에서 ^의 용도를 잘 생각하라..
* 0번 또는 그 이상의 문자를 찾습니다. (ex. "j[a*]" 는 java, jad ... 의 ja를 검색합니다.)

() 식을 해석하는 순서를 바꾸거나 식을 태그로 표시할 때 사용합니다.



참고.. (http://blog.naver.com/satmania?Redirect=Log&logNo=90008546174)

"ab*" a뒤에 0 이상의 b가 있는 문자열 ("a", "ab", "abbb", 등)
"ab+" 위와 동일 하지만 최소한 하나 이상의 b가 있어야 함 ("ab", "abbb", 등)
"ab?" b가 하나 있을 수도 있고 없을 수도 있음 (ab 또는 a)
"ab{2}" a뒤에 2개의 b가 있는 문자열 ("abb"); "ab{2,}" a뒤에 최소한 2개 이상의 b가 있는 문자열 ("abb", "abbbb", 등.); "ab{3,5}" a뒤에 3개에서 5개 사이의 b가 있는 문자열 ("abbb", "abbbb", 또는 "abbbbb").
{ }를 사용할 대는 반드시 첫 번째 숫자는 적어야 됨을 유의합니다. ((O) "{0,2}", (X) "{,2}"). 또한 '*', '+', '?'는 각각 "{0,}", "{1,}", "{0,1}"와 같습니다.

이제 ()를 사용해서 하나의 문자가 아닌 여러 문자를 지정하는 방법을 알아봅니다.

"a(bc)*": a 뒤에 "bc"가 0또는 그이상의 수만큼 있는 문자열
"a(bc){1,5}": a 뒤에 "bc."가 1에서 5번 들어 있는 문자열

또 다른 특수문자로는 OR 연산을 하는 '|'를 들 수 있습니다.

"hi|hello": "hi"나 "hello"가 들어 있는 문자열
"(b|cd)ef": "bef" 또는 "cdef"
"(a|b)*c": a와 b가 섞여서 여러번 나타나고 그뒤에 c가 붙어있는 패턴

'.' (period)는 어떤 한 문자를 의미합니다.

"a.[0-9]": a뒤에 한 문자와 숫자가 붙어 있는 패턴

"^.{3}$": 3문자로만 되어 있는 문자열

[]표현은 문자열의 해당 위치에 사용될 수 있는 문자를 표현하는데 사용합니다.

"[ab]": a또는 b ("a|b"와 동일한 표현);

"[a-d]": 소문자 'a'에서 'd'까지 ("a|b|c|d"또는 "[abcd]"와 동일);

"^[a-zA-Z]": 영문자로 시작하는 문자열

"[0-9]%": % 문자 앞에 하나의 문자가 붙어 있는 패턴

",[a-zA-Z0-9]$": 영문자, 숫자로 끝나는 문자열 패턴

[]에서 '^'를 표현의 가장 처음에 사용하면 나타나서는 안 되는 문자를 지정할 수 있습니다. (예> "%[^a-zA-Z]%" 두 % 사이에 영문자가 없는 패턴)

"^.[$()|*+?{"같은 특수 문자는 백슬레쉬('')를 사용해서 escape될 수 있습니다( 역자 주 : escape 이란 다른 말로 literal로 탈출한다라고 할 수 있습니다 즉 특수문자로 인식되지 않고 일반 문자로 인식되게 합니다). 사용하는 관점에서 보면 백슬레쉬도 PHP3의 문자열에서 escape되어야 하기 때문에 예를 들어 "($|?[0-9]+"같은 정규표현식은 ereg("(\$|?[0-9]+", $str) 와 같이 사용됩니다 (이 표현식은 무얼 검사하는 걸까요? ^^;(이건 역자가 한 말이 아닙니다))

하지만 []안에서는 특수문자가 모두 효력을 읽게 되기 때문에 이 법칙을 벗어남을 기억하세요 []안에서는 백슬레쉬를 포함한 모든 특수문자들이 그 힘을 읽습니다 (예> "[*+?{}.]"는 말그대로 '*', '', '+', '?', '{', '}', '.' 문자를 의미합니다. 그리고 regex man 페이지에 나오듯이 ']'문자 자체를 포함하려면 문자들 리스트의 첫 번째에 위치시킵니다('^'가 있으면 '^'뒤에). '-'를 포함하려면 첫 번째 또는 마지막 문자로 지정하고 '-'문자가 영역의 경계 (예> a에서 -까지)일 경우 영역지정 문자의 두 번째 경계로 지정([a--])합니다.

완벽한 설명을 하려면 대조 순서(collating sequences), 문자 클래스(character classes), 동일 클래스(equivalence classes)에 대해서도 다루어야 하지만 이 글에서는 별 상관관계가 없기 때문에 regex man 페이지를 참고하도록 합니다.



활용

(ja+)[a-zA-Z]*  :  ja로 시작하는 모든 문장을 찾습니다.

more..



* 정규식에 관한 것들
jakarta project 의 Regexp 패키지에 관한글  http://www.superuser.co.kr/jsp/jsp02/page24.htm
php에서의 정규식 http://blog.naver.com/hbini?Redirect=Log&logNo=80029262521
java의 공식적 정규식 문서 http://java.sun.com/developer/technicalArticles/releases/1.4regex/

댓글 없음:

댓글 쓰기