1. 간략 정리
정규식  설명 예제
 . 임의의 한 문자(필수)를 의미 합니다. ab.(abc, abd,abe) ..
 ? 바로 앞에 문자가 없거나 하나가 있음을 의미 합니다. a?c (ac, abc, bc) ..
 * 바로 앞에 문자가 없거나 하나이상 반복을 의미 합니다. ab* (a, ab, aaa) ..
 + 바로 앞에 문자가 하나이상 반복을 의미 합니다. ab+ (ab, abb, abbb) ..
 ^ 문자열의 시작을 의미 합니다. ^ab (abc, abcd, abcde) ..
 [^] ^이후의 괄호안 형식을 제외함을 의미 합니다. [^ab]cd (ecd, fcd, gcd) ..
$
문자열의 끝을 의미 합니다. abc$ (pupu abc, story abc) ..
 [] []안의 형식 일치를 의미 합니다. [abc] (a, b, c, ab, bc, abc) ...
 {} {}앞 문자열(혹은 문자) 반복 갯수를 의미 합니다. ab{2} (abab)
ab{2,} (2개이상)
ab{1,2} (1부터 2까지)
 () ()안의 내용 을 하나의 묶음으로 사용 함을 의미 합니다. (ab){2} (abab)
(ab)+ (ab, abab, ababab ..)
 | or연산을 의미 합니다. (a|b|c)  (a, b, c, ab,abc ..)
 [0-9] (부터 - 까지)의 숫자를 의미 합니다. [0-9] (0, 1, 2, 3, 4 ..)
[a-z]
(부터 - 까지)의 소문자를 의미 합니다. [a-z] (a, b, c, d ..)
 [a-zA-Z] (부터 - 까지)의 대,소문자를 의미 합니다.  [a-zA-Z] (a, b, A, B ..)
 \p(Alpha) 대,소문자 아파벳을 의미 합니다. (a, b, c, D, E, F ..)
\p(Digit)
숫자를 의미 합니다. (1, 2, 3 ..)
 \p{Alnum} 대,소문자 아파벳, 숫자를 의미 합니다. (a, b, c, d, e, 1, 2, 3 ..)
\d 숫자를 의미 합니다. (1, 2, 3, 4 ..)
 \D 숫자가 아닌 것을 의미 합니다.   (a, b, d, E ..)

\s : whitespace(space, tab, newline, carriage return, form feed)
\S : whitespace를 제외한 모든 문자
\w : 단어문자[a-zA-Z_0-9]
\W : 단어가 아닌 문자
\xhh : 16진수 0xhh로 표기된 문자
\t : tab
\n : newline
\r : carriage return
\f : form feed
\e : escape









2. 책 내용정리 (http://youreme.blog.me/110078026089)
 
  1. 2 문자 하나 찾기
    • 마침표(.) 어떠한 문자나 알파벳, 숫자, 심지어는 문장 부호로 쓰인 마침표(.) 자체와도 일치한다.
    • 대다수의 정규 표현식 구현에서 마침표(.) 줄바꿈 문자를 제외한 모든 문자와 일치한다.
    • 역슬래시(\) 문자들이 문자 그대로 해석되게 하며(이스케이프), 특수한 문자 시퀀스를 시작하는데 사용된다.
  2. 3 문자 집합으로 찾기
    • 메타 문자인 대괄호([ ]) 사용해 문자 집합을 표현한다.
    • 대괄호([ ])안에 있는 문자는 모두 집합의 구성원이 되며, 집합에 속한 문자 가운데 하나가 일치한다.
    • 얻고자 하는 결과와 패턴이 일치하는지 확인하는 일은 매우 쉽지만, 진짜 도전과제는 얻고 싶지 않은 결과도 일치하는지 확인하는 일이다.
    • 문자 범위를 단순하게 만들 정규 표현식에서는 특별한 메타 문자인 하이픈(-) 제공한다.
    • A-z 패턴은 사용하지 않도록 하자.
      • Z a사이에 속하는 아스키 문자 중에는 여는 대괄호( [ ) 캐럿(^) 같은 문자도 포함되기 때문이다.
    • 범위를 지정할 때는 값이 앞에 나오면 된다.
    • 하이픈(-) 대괄호([ ])안에서만 메타 문자인 특수한 메타 문자이다.
      • 집합 밖에서 하이픈(-) 단순한 문자 그대로 하이픈(-) 일치한다.
      • 집합 밖에서는 하이픈(-) 문자에 굳이 역슬래시(\) 붙일 필요가 없다.
    • 캐럿(^)문자는 제외할 문자 집합을 지정한다.
      • 캐럿(^)문자는 문자 바로 뒤에 있는 문자나 범위뿐만 아니라 집합 안에 있는 문자나 범위를 모두 제외한다.
  3. 4 메타 문자 사용하기
    • 공백 메타 문자

    메타 문자

    설명

    [\b]

    역스페이스

    \f

    페이지 넘김(form feed)

    \n

    줄바꿈

    \r

    캐리지 리턴

    \t

    \v

    수직

    • \r\n 줄바꿈과 캐리지 리턴의 조합과 일치한다.
      • 윈도우에서 조합은 줄의 끝을 나타내는데 사용한다.
      • 유닉스와 리눅스에서는 단순히 줄바꿈 문자만 사용한다.
    • 숫자 메타 문자

    메타 문자

    설명

    \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] 같다)

    • \s \S 역스페이스 메타 문자인[\b] 포함되지 않는다.
    • 포직스 문자 클래스

    분류

    내용

    [: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] 같다)

    • 포직스 문자 클래스는 줄여 쓰기를 나타내는 다른 형태인데, 전부는 아니지만 많은 정규 표현식에서 구현을 지원한다.
    • 자바스크립트는 정규 표현식에서 포직스 문자 클래스를 지원하지 않는다.
  1. 5 반복 찾기
    • 문자나 집합에 속한 요소(instance) 하나 이상 찾으려면 간단히 문자 뒤에 더하기(+)문자를 붙이면 된다,
      • 문자 집합에 더하기(+) 사용할 때는, 더하기(+) 집합 바깥에 두어야 한다.
      • , [0-9+] 아니라 [0-9]+ 맞는 표현이다.
      • 더하기(+) 하나 이상 연속된 문자를 찾는다. 따라서 최소한 하나는 일치해야 한다.
    • 있을 수도 있고 없을 수도 있는 문자와 일치시키려면 메타 문자인 별표(*) 사용한다.
      • 별표(*) 문자나 집합이 없는 경우 또는 하나 이상 연속하는 경우에 일치한다.
    • 특정한 문자 하나만 찾을 때는 메타 문자인 물음표(?) 사용한다.
    • [\r]?\n
      • 유닉스나 리눅스 환경에서는 \r 제외하고 \n 사용하므로 이에 대한(줄바꿈) 정규표현식이다.
    • 구간은 중괄호({ })안에 표시한다.
    • 문자나 일치하는 수를 정확히 정하려면 여는 중괄호( { ) 닫는 중괄호( } ) 사이에 숫자를 넣는다.
    • 일치시키려는 요소(instance) 최소값과 최대값을 나타낼 때도 구간을 사용한다.
      • {2,4} 최소 두번에서 최대 4번을 뜻한다.
    • 최소 구간 찾기
      • 구간 검색은 최대값 없이 찾고자 하는 요소의 최소값을 지정할 수도 있다.
      • {3,} 최소 3 일치함을 의미한다.
      • 최소값으로 구간을 찾을 때는 주의해야 한다. 만약 쉼표(,) 빠지면 요소의 최소값이 아니라 정확히 지정한 만큼 일치시키는 것으로 인식한다.
    • 과하게 일치하는 상황 방지하기(탐욕적 수량자)
      • 별표(*) 더하기(+)같은 메타 문자가 탐욕적(greedy)이기 때문에 이는 가능한 가장 덩어리를 찾으려 한다.
      • 이런 메타문자는 찾으려는 텍스트를 앞에서부터 찾는 아니라, 텍스트 마지막에서 시작해서 거꾸로 찾는다.
      • 이는 의도적으로 수량자(quantifier) 탐욕적으로 설계했기 때문이다.
      • 이에 대한 반대 기능은 수량자를 게으른(lazy) 수량자로 바꿔 해결한다.
      • 탐욕적 수량자와 게으른 수량자

    탐욕적 수량자

    게으른 수량자

    *

    *?

    +

    +?

    {n,}

    {n,}?


  2. 6 위치찾기
    • 위치 찾기(position matching) 텍스트 문자열 안에서 반드시 일치해야 하는 위치를 지정할 사용한다.
    • 단어 경계 지정하기(\b 표시하는 단어 경계)
      • \b 단어의 시작이나 마지막을 일치시킬 사용한다.
      • 완전한 단어 하나를 일치시키고자 한다면, 일치시키고자 하는 단어 앞뒤에 모드 \b 붙인다.
      • \b 실제로 문자와 일치하는 것이 아니고, 위치를 가리킨다.
      • 특별히 단어 경계와 일치시키고 싶지 않을 , \B 사용한다.
    • 문자열 경계 정의하기
      • 문자열 경계는 메타 문자 가운데 캐럿(^)으로 문자열의 시작을, 달러기호($) 문자열의 마지막을 나타낸다.
      • 캐럿(^)문자는 여러 용도로 쓰는 몇몇 메타 문자 중의 하나이다.
        • 대괄호([ ]) 둘러싸인 집합 안에서는 여는 대괄호( [ )문자 바로 다음에 쓰면 부정을 뜻한다.
        • 집합 밖에서는 패턴 시작 부분에 캐럿(^)문자를 쓰면 문자열의 시작 부분과 일치한다.
    • .* 텍스트가 없는 경우도 포함하여 사이에 있는 모든 텍스트와 일치한다.
    • 다중행 모드 사용하기
      • 많은 정규 표현식 구현은 다른 메타 문자의 동작을 변경하는 특수한 메타 문자를 지원하는 하나가 (?m)으로, 다중행(multiline) 지원한다.
        • 다중행 모드로 변경하면 강제로 정규 표현식 엔진이 줄바꿈 문자를 문자열 구분자로 인식한다.
          • 캐럿(^) 문자열의 시작이나 줄바꿈 다음(새로운 ) 나오는 문자열의 시작과 일치
          • 달러 기호($) 문자열의 마지막이나 줄바꿈 다음에 나오는 문자열의 마지막과 일치
        • (?m) 항상 패턴 제일 앞에 두어야 한다.
        • (?m) 지원하지 않는 정규 표현식 구현도 많다.
  3. 7 하위표현식 사용하기
    • 하위 표현식은 표현식 안에 속한 일부 표현식을 항목으로 다루도록 한데 묶은 것이다.
    • 하위 표현식은 괄호 사이에 사용한다.
    • 어떤 사용자들은 가독성을 높이고자 표현식 일부를 하위표현식으로 묶기도 하는데, 이는 사용하는 정규 표현식 구현에 따라 성능 문제가 발생할 수도 있다.
    • OR( | ) 연산자
      • 묶음 안에서 하나를 일치시키고자
    • 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])) 
  1. 8 역참조 사용하기
    • 역참조는 정규 표현식 패턴으로, 앞서 일치한 부분을 다시 가리킨다.
    • 역참조를 변수와 비슷하게 생각해도 된다.
    • 예제)

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

    • [ ]+ 공백이 하나 이상 연속되는 경우 일치하고, \w+ 영숫자 문자가 하나 이상 연속되는 경우 일치하며, [ ]+ 뒤에 공백이 있을 일치한다.
    • 여기서, \1 앞서 일치한 하위 표현식을 참조함을 의미한다. 따라서, (\w+) 일치하는 문자는 \1과도 일치한다.
    • 자바스크립트는 역참조를 표시할 역슬래시(\) 사용하는데, 펄은 달러기호($) 사용한다.
    • 역참조는 참조하는 표현식이 하위 표현식일 때만 동작한다.
    • 많은 구현에서 0번째 참조라고 하면 표현식 전체를 가리킨다.
    • 치환 작업 수행하기
      • 정규표현식을 치환하는 작업은 역참조와 함께 사용했을 진가를 발휘한다.
      • 예제)

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

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

    • 패턴에서 일치한 하위 표현식을 번째 패턴에도 썼다.
    • 대소문자 치환하기
      • 대소문자 변환 메타 문자

    메타 문자

    설명

    \E

    \L 혹은 \U 변환의 끝을 나타낸다.

    \l

    다음에 오는 글자를 소문자로 변환한다.

    \L

    \E 만날 때까지 모든 문자를 소문자로 변환한다.

    \u

    다음에 오는 글자를 대문자로 변환한다.

    \U

    \E 만날 때까지 모든 문자를 대문자로 변환한다.

    • \l \u 바꾸고 싶은 글자 앞에 두어 각각 글자를 소문자와 대문자로 바꾼다.
    • \L \U \E 만날 때까지 모든 문자를 각각 소문자와 대문자로 변환한다.
    • 예제)
      • 정규표현식 : (<[Hh1>)(.*?)(</[Hh1>)
      • 치환 : $1\U$2\E$3
    • 역참조는 텍스트를 검색하고(match), 치환하는 매우 유용하다.
       
  2. 9 전방탐색과 후방탐색
    • 전방탐색은 모든 주요 정규 표현식 구현에서 지원하지만, 후방탐색은 광범위하게 지원하지 않는다.
    • 전방탐색 - 앞으로 찾기
      • 전방탐색(lookahead)패턴은 일치 영역을 발견해도 값을 반환하지 않는 패턴을 말한다.
      • 전방탐색은 실제로는 하위 표현식이며, 하위 표현식과 같은 형식으로 작성한다.
      • 전방탐색 패턴의 구문은 ?=으로 시작하고 등호(=) 다음에 일치하는 텍스트가 오는 하위 표현식이다.
      • 예제)

    .+(?\:)

    • ?= 정규 표현식 엔진에게 콜론(:) 찾되 콜론(:) 앞에 있는 문자를 찾으라고(소비는 하지 말고) 지시한다.
    • 일부 정규표현식 문서에서는 일치하는 영역을 반환하는 동작을 표현할 '소비한다(consume)'라는 용어를 쓴다.
    • 모든 하위 표현식 앞쪽에 단순히 ?= 붙이기만 하면 전방탐색 표현으로 바꿀 있다.
    • 하나의 검색 패턴 속에서 여러 개의 전방탐색 표현식을 사용할 있고, 또한 표현식은 패턴 안에서 어느 위치에서든 사용할 있다.
    • 후방탐색 - 뒤로 찾기
      • 후방탐색 연산은 ?<=이다.
      • 전방탐색 패턴은 마침표(.) 더하기(+) 포함하여 텍스트의 길이를 다양하게 일치시킬 있으며, 매우 동적이다.
      • 반대로 후방탬색 패턴은 보통 일치시킬 텍스트의 길이를 고정해야 한다.
      • 거의 모든 정규 표현식 구현에는 이런 제약이 있다.
    • 부정형 전후방탐색
      • 부정형(negative) 전후방탐색은 비교적 쓰는 방법이다.
      • 부정형 전방탐색은 앞쪽에서 지정한 패턴과 일치하지 않는 텍스트를 찾고,
      • 부정형 후방탐색도 이와 비슷하게, 뒤쪽에서 지정한 패턴과 일치하지 않는 텍스트를 찾는다.
      • 전후방탐색 명령

    종류

    설명

    (?=)

    긍정형 전방탐색

    (?!)

    부정형 전방탐색

    (?<=)

    긍정형 후방탐색

    (?<!)

    부정형 후방탐색

  3. 10 조건 달기
    • 모든 정규 표현식 구현에서 조건 처리를 지원하지는 않는다.
    • 정규 표현식 조건은 물음표(?) 사용해 정의한다.
      • (?(backreference)true)
        • 물음표(?) 조건을 시작하고, 괄호 안에 역참조를 지정한 다음, 역참조가 존재하는 경우에만 평가될 표현식이 바로 뒤에 나온다.
        • 예제)

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

    • ?(1) 역참조 1(<A>시작 태그) 있을 때만 수행하라는 말이다.
    • 다른 말로, 태그<A> 일치한다면 뒤의 종료 태그도 일치시키라는 뜻이다.
    • ?(1) 역참조 1 있는지 없는지를 검사한다. 역참조 번호를 조건에서 이스케이프 필요는 없다.
    • , ?(1) 맞고, ?(\1) 잘못된 것이다. 그렇지만 후자도 동작한다.
    • (?(backreference)true|false)
    • 전후방 탐색 조건
      • 전후방탐색 조건은 전방탐색과 후방탐색 명령이 성공했는지에 따라 표현식을 수행할지 결정한다.
      • 전후방탐색 조건은 역참조(괄호안에 넣는 숫자) 완전히 전후방탐색 표현식으로 대체되었다는 점만 빼고는 역참조 조건과 동일하다.
      • 예제)

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

    • 하이픈이 있다는 조건을 만족하면, -\d{4} 하이픈과 이어 나오는 숫자 개와 일치한다.
    • 간단한 방법으로 비슷한 결과를 얻을 있기 때문에 전후방탐색 조건은 자주 사용하지 않는다.



      출처 : 민이(youreme) http://youreme.blog.me/110078026089

'Java' 카테고리의 다른 글

jdbc lib url 모음  (1) 2011.01.10
java mail helper  (2) 2010.12.24
pc 캠 화면 JFrame 에 출력하기  (1) 2010.04.09
java socket 통신  (2) 2010.04.07
lotto 당첨번호 파싱  (4) 2010.04.07