레이블이 정규표현식인 게시물을 표시합니다. 모든 게시물 표시
레이블이 정규표현식인 게시물을 표시합니다. 모든 게시물 표시

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/