☞ 정의 |
|
|
☞ 기본 메타 문자 |
|
. |
모든 문자 일치 |
| |
OR 왼쪽 문자(혹은 패턴) 혹은 오른쪽 문자(혹은 패턴)과 일치 |
[] |
문자 집합 구성원 중 하나와 일치 예) [abc] : a 혹은 b 혹은 c |
[^] |
문자 집합 구성원을 제외하고 일치, [^abc] : a,b,c 제외한 모든 문자 |
- |
범위 정의 ([A-Z]와 같은 형태로 대문자 A에서 Z사이의 문자를 의미) |
\ |
다음에 오는 문자를 이스케이프 |
기본 메타 문자는 글자 하나의 의미를 말한다. 이자체만으로는 큰 활용도가 없고 다른 기능들과 같이 쓰일때 의미가 있다. 일단 이런게 있구나 하고 넘어가고, 밑에 같이 사용될 때 다시와서 참조해야 제대로 이해 할 수 있을 것이다. |
☞ 수량자 |
|
* |
앞의 문자나 부분식이 0개 이상 탐욕적으로 찾기 |
*? |
탐욕적 수량자 *를 게으른(lazy) 수량자로 바꿔 찾기 |
+ |
앞의 문자나 부분식을 하나 이상 탐욕적으로 찾기 |
+? |
탐욕적 수량자 +를 게으른(lazy) 수량자로 바꿔 찾기 |
? |
앞의 문자나 부분식을 0개나 1개 찾기 |
{n} |
앞의 문자나 부분식이 정확히 n번 일치하는 경우 찾기 |
{m,n} |
앞의 문자나 부분식이 m번에서 n번 일치하는 경우 찾기 |
{n,} |
앞의 문자나 부분식이 n번 이상인 경우를 탐욕적으로 찾기 |
{n,}? |
탐욕적 수량자 {n,}를 게으른(lazy) 수량자로 바꿔 찾기 |
문자 하나가 아니라 조건에 해당하는 붙어있는 여러개의 문자를 찾는다는 것이 핵심이다. *, + 의 차이를 이해해야 한다. *는 없는 경우가 포함되고, +는 무조건 하나는 있어야 한다는 의미다. 예를 들어, a*4와 a+4 모두 "123aaa456"를 빨간색처럼 찾는다. 하지만 "123456" 인 경우에는 a*4인 경우에만 4를 찾고(123456), a+4는 아무것도 찾지 못한다. 왜냐하면 *는 "a" 없이 "4"만 있어도 되지만 +는 a가 반드시 하나는 있어야 하기 때문이다.
다음으로 탐욕적 수량자와 게으른 수량자를 이해해야 한다. 이부분은 매우 중요하면서도 처음엔 어려울 수 있는 부분이다. 탐욕적 수량자의 핵심은 조건에 맞지 않을 때까지 하나의 패턴으로 인식하는 것이고, 게으른 수량자의 핵심은 조건에 맞으면 욕심부리지 말고 거기서 끝내는 것이다. 다음의 예제를 보자.
Test0<div>Test1</div>Test<div>Test2</div>Test4
다음은 정규표현식에 따른 결과다.
- <div>.*</div> : Test0<div>Test1</div>Test<div>Test2</div>Test4 => <div>를 처음 발견한 후 </div>를 발견했지만 탐욕적으로 그 다음 </div>가 없는지 찾는다. 로직 상에는 <div>를 찾으면 </div>를 뒤에서부터 찾는다고 한다.
- <div>.*?</div> : Test0<div>Test1</div>Test<div>Test2</div>Test4 => <div>를 발견한 이후에 </div>를 만나면 욕심부리지 않고 여기서 끝낸다.
여기서는 "?"의 의미가 헷갈리지 않도록 정리를 잘 해야 한다.*, +, {} 다음에 나오는 물음표(?)는 탐욕적 수량자를 게으른 수량자로 바꾸는 의미를 가지지만, 패턴 다음에 오는 물음표는 해당 패턴이 있을 수도 있다의 의미를 가진다. 전후방탐색에서도 물음표의 의미가 달라지므로 확실한 의미를 파악해두는 것이 좋다. |
☞ 위치 지정 |
|
^ |
입력 문자열의 시작 부분에서 그 다음 나오는 문자나 부분식과 일치하는지 검사 |
\A |
어떤 정규식에서는 ^의 역할을 함 |
$ |
문자열의 끝과 일치 |
\Z |
어떤 정규식에서는 $의 역할을 함 |
\b |
단어 경계(단어와 공백 사이의 위치)와 일치 예) 'st\b'는 "test"의 st는 찾지만, "tester"의 st는 찾지 않음 !주의! test test 에서 test 사이의 빈공간인 space와는 다른 의미 |
\B |
\b와 반대(비단어 경계)로 일치. 즉 "\b"의 예제의 반대 결과가 나옴 |
말이 좀 어려운데, 결국은 글자자체를 찾는 물리적 의미가 아니라 내부적인 의미를 찾는 논리적 수행만 한다. 이것도 이자체만으로는 의미가 없으며 ^, \b, \B 다음이나 \b, \B, $ 전에 나오는 문자나 부분식과 함께 동작한다. |
☞ 특수한 문자 |
|
[\b] |
역스페이스 |
\cx |
x로 표시된 제어문자 찾기. x는 [A-Za-z] 이어야 함. 아니면 c는 리터럴 'c'로 간주
예) \cM = Control-M 이나 캐리지 리턴 문자. |
\d |
모든 숫자와 일치. [0-9]와 동일 |
\D |
\d와 반대. [^0-9]와 동일 |
\f |
용지 공급 문자 찾기. 페이지 넘기기(formfeed) = \x0a, \cL |
\n |
줄 바꿈 문자 찾기. \x0a, \cJ |
\r |
캐리지 리턴. \x0d, \cM |
\s |
공백, 탭, 용지 공급 등과 같은 문자 찾기. [\f\n\r\t\v] |
\S |
\s와 반대로 일치. [^\f\n\r\t\v] |
\t |
탭 문자 찾기. \x09, \cI |
\v |
세로 탭 문자 찾기. \x0b, \cK |
\w |
영숫자 문자나 밑줄과 일치. [a-zA-Z0-9_] |
\W |
\w와 반대로 일치. [^a-zA-Z0-9_] |
\xn |
n으로 표시된 16진수 이스케이프 값과 일치. 16진수는 정확히 2자리여야 함 |
\0n |
n으로 표시된 8진수 숫자와 일치. 가급적 사용하지 않는 것이 좋음 |
하나하나 [] 안에 넣어주어야 하는 문자들을 미리 정의해둔 것으로 이해하면 된다. []를 사용하는 것과 동작의 차이는 없지만 패턴 글자의 수를 줄일 수 있기 때문에 알아두면 보기 편하다. |
☞ 역참조와 전후방탐색 |
|
(pattern) |
하위 표현식 정의. 패턴을 찾아 일치하는 항목을 캡처하는 부분식. 가로 자체 '('나 ')'를 찾고 싶으면 '\'를 붙여 이스케이프하면 된다. '\(', '\)' |
\1 |
첫 번째 일치한 하위 표현식, 두 번째 일치한 하위 표현식은 \2로 표기 |
(?=pattern) |
전방탐색 |
(?!pattern) |
부정형 전방탐색 |
?(BR)true |
조건 지정 |
?(BR)true|false |
else 표현식 조건 지정 |
()는 []와 전혀 다른 의미라는 사실을 머리에 각인해야 한다. 이 파트가 정규표현식에서 가장 어려운 부분이며 프로그래밍 할 때 가장 많이 사용되는 부분이기도 하다. 가로로 묶은 하위표현식은 역참조 시 사용하기도 하지만, 프로그래밍에서는 하위표현식에 해당하는 문자열을 배열이나 그룹으로 따로 제공해 주기 때문에 유용하게 사용할 수 있다. |
☞ 대소문자 변환 |
|
\E |
\L 혹은 \U 변환을 끝냄 |
\l |
다음에 오는 글자를 소문자로 변환 |
\L |
\E를 만날 때까지 모든 문자를 소문자로 변환 |
\u |
다음에 오는 글자를 대문자로 변환 |
\U |
\E를 만날 때까지 모든 문자를 대문자로 변환 |
문자열을 찾은 후 이를 바꾸는 용도로 사용한다. 찾기만 하려고 정규식을 사용한다면 필요없는 부분이기도 하다. |
☞ 옵션 |
|
i |
ignore case, 대소문자를 무시하여 찾음. 굳이 [a-zA-Z]라고 할 필요가 없음 |
g |
global, 찾는 패턴을 하나만 찾지 말고 계속 해서 찾음. 탐욕적 수량자처럼 일치하는 구간을 늘리는 것이 아니라 일치하는 패턴의 개수가 늘어남 |
m |
multiline, 다중행 모드라고도 하며 라인 별로 처리하는 것이 아니라 입력 문자열에 줄바꿈이 있어도 이를 특수문자로 변환하여 하나로 봄. 가장 큰 차이를 경험할 수 있는 기능은 ^와 $임. | |
|
|
1. [] : 대괄호 안에 값을 넣은 기준으로 찾을 범위를 지정 예) [abc], [ABC], [0123] 2. - : 마이너스 앞뒤에 존재하는 내에서 찾을 범위를 지정 예) 1-5, A-C, A-Z, a-m, 가-힝, ㄱ-ㅎ 3. |
|
1. [/^] : 정규식 선언의 시작을 알림. 2. [$/] : 정규식 선언의 끝을 알림 |
☞ 정규식 Function |
|
1. REGXP_REPLACE : 2. REGXP_SUBSTR : 3. REGEXP_COUNT : 4. REGEXP_LIKE : |
☞ |
|
|