Programming > Java

정규표현식 - 문법설명

일치하는 문자 선택

매칭기호 설명
x 문자 x
\\ 백슬러쉬 문자 표현
\0n 8진수문자. 8진수 0n을 표현한 문자 (0 <= n <=7)
\0nn 8진수문자. 8진수 0n을 표현한 문자 (0 <= n <=7)
\0mnn 8진수문자. (0 <= m <= 3, 0 <= n <= 7)
\xhh 16진수 문자. 0xhh  hh는 16진수
\uhhh 16진수 문자 0xhhhh
\t 탭(tab), (\u0009)
\n 개행문자, (\u000A)
\r 캐리지리턴문자, (\u000D)
\f 종이보내기문자 (\u000C)
\a 경고벨 문자 (\u0007)
\e escape 문자 (\u001B)
\cx x에 대응하는 제어문자를 나타냄

미리 정의된 문자 ( escape 문자)

매칭기호 설명
. 임의의 문자
\d 숫자 [0-9]
\D 숫자이외 [^0-9]
\s 공백문자 [\t\n\x0B\f\r]
\S 위 공백문자 이외 [^\s]
\w 영어단어표현  [a-zA-Z_0-9]
\W 영어단어외 표현 [^\w]
. ( ) [ ] ^ $ \  \. \( \) \[ \] \^ \$ \\
좌측 문자는 \를 앞에 붙여 escape...

경계 또는 위치를 표현한는 정규표현

※ 영어단어는 (a-z, A-Z, 0-9, _ , Unicode문자)

매칭기호 설명
^ 행의 맨앞
$ 행의 맨끝
\b 단어의 경계(영어단어의 경계
(□Where□is□your□school□?)
 위에서는 □가 표현하는 것이 단어의 경계가 된다.
String regex = "\\bsch"; 의 경우 위 빨강을 표현한다.
\B 단어이외의 경계
\A 문자열(입력) 맨앞 ( ^와 다른점은 문자열에 개행문자 포함여부와 관계없이 multi라인 문자열에도 맨 처음만 확인
\G 이전에 일치한 끝
\Z 맨뒤에 행끝기호가 있을경우, 그것을 제외한 입력의 끝
\z 입력의 끝

주요한 정규표현 기호

기호 설명
. 개행문자를 제외한 임의의 문자
.+  : 임의의 문자열
* 바로전 1문자가 0회 이상 반복 또는 일치하는 경우
abc*  : ab, abc, abcccc, abxx 는 일치,  axb 는 불일치
^ 행의 맨앞
^[0-9] : 행의 맨 앞이 숫자(0~9)로 시작하는 것
$ 행의 끝
[0-9]$ : 행의 끝이 숫자로 끝나는 것
+ 바로전의 문자가 1회이상 반복 또는 일치
abc+  : abc, abcccc 는 일치,  ab, abxxx, axb 는 불일치
? 바로전 문자가 없거나(0) 1개일 경우
abc?  : ab, abc, abcccc 는 일치
[ ] 대괄호내 임의 1문자와 일치 
안의 하이픈- 은 범위를 나타냄 : [a-z]  a~z까지중 1개와 일치
^ 는 불일치 : [^A-Z] 영어 대문자 이외의 것을 표시
{ } 중괄호내 숫자의 반복횟수와 일치 
{n}  :앞의 문자의 n회 반복과 일치
{,n} : 앞의 문자의 n회 이하 반복과 일치
{m,} : 앞의 문자의 m회 이상 반복과 일치
{m,n} : 앞의 문자의 m회 이상 n회이하 반복과 일치
| 파이프라인 or 과 같다 어느 한쪽에 일치
abc|def  : abc나 def 둘중 하나에 일치
( ) 괄호를 그룹화 한다. 일치한 내용을 참조할 수 있다.

 

최단(最短) 일치

최단일치 가장 가까운이라기 보다는 가장 왼쪽을 기준으로 맞춰나가는 의미를 지닌다.

ex )  <emunhi> 를 패턴 검색할려고 하는데 아래와 같은 문자열이 있는 경우
<<<emunhi>>>

이를 패턴 검색에서 최단일치인 <.*?> 와 같은 패턴을 사용할 경우 결과는
result :  <<<emunhi>  가 된다.

만약 원하는 답을 원하기 위해서는 '<' 와 '>' 사이에 '<' 와 '>'가 없는 패턴을 검색하면 된다.
"<<<emunhi>>>".match(/<[^<>]*>/)[0]
result :  <emunhi>

 
최장일치 최단일치 설명
x* x*? 0문자 이상 반복되는 x
x+ x+? 1문자 이상 반복되는 x
x? x?? 0 또는 1문자 x
x{n} x{n}? x 가 n회 반복
x{n,} x{n,}? x 가 n회 이상 반복
x{,m} x{,m}? x 가 m회 이하 반복
x{n,m} x{n,m}? x 가 n ~ m 사이 반복

 

복합적인 문자클래스

기호 설명
OR : [abc] 일반적으로 a 또는 b 또는 c  셋중 하나
[a-cx-z]  : a,b,c, x,y,z 중에 하나
위와 동일한 건 [[a-c]x-z] , [a-c[x-z]], [[a-c][x-z]]
AND : [a-z&&c-e] a~z 이면서 c~e 인 것 즉 c~e와 동일
[a-z&&[^dex]] : a~z중에 d,e,x를 제외한 소문자 
[a-z&&[e-k]] : e~k를 제외한 소문자
소문자 : (?i) 앞에 (?i)를 추가하면 대소문자를 구분하지 않는다.
전방참조안함 : (?:X) 그룹화시 인덱스를 부여안해 자원을 낭비하지 않게....(세미콜론)
m.group(n) 에 포함되지 않는다.
숫자만 : ^[0-9]*$ 0~9로 시작하고 0회이상 반복하면 0~9로 끝나는 것
영문자만 : ^[a-zA-Z]*$ 위와 동일
한글만 : ^[가-힣]*$  
영수,언더바 : ^[a-zA-Z_0-9]*$  

실용적인 표현들

용도 샘플 설명
이메일 ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$ 1개이상 영수시작 + @ + 1개이상영수끝
숫자(자릿수) \d{2,10} 2자리~10자리의 숫자
금액 3자리 콤마 -?([1-9]\d{0,2}(,\d{3})*|[1-9]\d{0,})
-?([1-9]\\d{0,2}(,\\d{3})*|[1-9]\\d{0,})
1,000,000 등을 구분 (좌 아래는 Java String)
자릿수 + 소숫점2 -?([1-9]\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2})?)  
우편번호(- 가부포함) \d{3}-?\d{4} xxx-yyy 또는 xxxyyy
Email address [a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*  
IP Address ((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)  
     
     

그룹화 (Group)

그룹은 열린괄호 ( 를 왼쪽부터 오른쪽으로 숫자를 세어 붙인 것이 된다. (0,1,2,...)

ex)  ( ( A ) ( B ( C ) ) )

  1. ((A)(B(C)))
  2. (A)
  3. (B(C))
  4. (C)