본문 바로가기

웹프로그램

정규표현식 문법2

# 정규표현식 기본 정의

/ 와 / 사이에 정규표현식 리터럴을 기술한다.

 

ex)

var pattern = /s$/;

 

위의 예에서

s는 글자 그대로 매치시킬 문자열.

$는 메타문자.

 

1. 리터럴 문자

\(역슬래시)로 시작하는 이스케이프 시퀀스를 통해 알파벳이 아닌 문자를 처리하는 것이 가능하다.

ex)

\0 : null 문자 (\u0000)

\t : 탭(\u0009)

\n : 줄바꿈(\u000A)

 

다음 아래의 기호는 정규 표현식에서 특별한 의미로 사용된다.

^ $ . * + ? = ! : | \ / ( ) [ ] { }

 

정규 표현식에서 역슬래시를 매치시키고 싶다면, 앞에 역슬래시를 적어야 한다.

예를 들어, 정규 표현식 /\\/은 역슬래시(\)를 포함한 문자열과 매치된다.

 

 

2. 문자 클래스

개별 리터럴 문자는 대괄호로 둘러싸서 문자 클래스로 묶일 수 있다.

정규 표현식 /[abc]/는 a, b, c 모두에 매치된다.

 

[...] : 대괄호 안에 있는 문자

[a-z] : 소문자 라틴 문자

[A-Z] : 대문자 라틴 문자

[0-9] : 임의의 숫자

[a-zA-Z0-9] : 임의의 라틴 문자나 숫자

[^...] : 대괄호 안에 없는 문자

. : 줄바꿈이나 Unicode 줄마침 문자를 제외한 아무 문자

\w : ASCII 문자( [a-zA-Z0-9_] 와 동일하다)

\W : ASCII 문자가 아닌 문자( [^a-zA-Z0-9_] 와 동일하다)

\s : Unicode 공백 문자

\S : Unicode 공백 문자가 아닌 문자

\d : ASCII 숫자( [0-9] 와 동일하다)

\D : ASCII 숫자가 아닌 문자( [^0-9] 와 동일하다)

[\s\d] : 공백 문자나 숫자

[\b] : 백스페이스 문자

 

 

3. 반복

정규 표현식의 원소가 몇 번이나 반복될 수 있는지를 기술하는 문법.

두 자리 숫자는 /\d\d/로 표현할 수 있고, 4자리 숫자는 /\d\d\d\d/로 표현할 수 있다.

임의의 자리수 숫자라면, 반복 문법을 사용해야 한다.

 

{n,m} : 앞의 항목이 적어도 n번 이상 나타나고, m번보다는 적게 나타난다.

{n,} : 앞의 항목이 n번 이상 나타난다.

{n} : 앞의 항목이 정확히 n번 나타난다.

? : 앞의 항목이 0 또는 한번 나타난다. 즉, 앞의 항목이 생략할 수 있음을 의미한다. 이 표현은 {0,1}과 동일하다.

+ : 앞의 항목이 한번 이상 나타난다는 것을 의미한다. 이 표현은 {1,}과 동일하다.

* : 앞의 항목이 0번 이상 나타난다는 것을 의미한다. 이 표현은 {0,}과 동일하다.

 

ex)

/\d{2,4}/ : 2에서 4자리의 숫자와 매치된다.

/\w{3}\d?/ : 정확히 3개의 문자와 매치되고, 생략가능한 하나의 숫자가 있다.

/\s+java\s+/ : 맨앞쪽과 맨뒤쪽에 한번 이상의 공백 문자가 있는 java 문자와 매치된다.

/[^"]*/ : 따옴표가 아닌 문자가 0번 이상 나타난다는 것을 의미한다.

 

 

4. 대체(or), 그룹화, 참조

- 4.1. 대체 : |

| 문자는 대체 표현식들을 구분한다. | 의 왼쪽이나 오른쪽의 부분 표현식을 매치시킨다.

/ab|cd|ef/ 는 문자열 "ab" 혹은 문자열 "cd" 혹은 문자열 "ef" 에 매치된다.

/\d{3}|[a-z]{4}/ 는 세자리 숫자 혹은 네 개의 소문자에 매치된다.

왼쪽에 있는 대체 표현식이 매치되면 오른쪽에 있는 표현식이 설령 더 잘 매치되더라도 무시된다.

 

- 4.2.1 참조 가능한 그룹화 : (...)

괄호는 그룹화에 사용된다. 원소들을 *, +, ?, |, 등과 함께 사용할 수 있게 단일 원소로 그룹화한다.

/java(script)?/는 생략 가능한 문자열인 script가 붙는, 문자열 "java"에 매치된다.

 

괄호를 사용하는 다른 목적은 완전한 패턴 안에 부분패턴을 정의하기 위한 것이다.

정규 표현식이 매치 대상 문자열에 성공적으로 매치되면,

이 문자열이 괄호로 묶여 있는 부분 패턴에 매치된 부분을 추출할 수 있다.

 

괄호로 묶은 부분 표현식을 사용하면 나중에 같은 정규 표현식 안에서 그 부분 표현식을 참조할 수 있다.

이 방법을 사용하려면 \ 문자 뒤에 한 자리 이상의 숫자 를 적어두면 된다.

 

ex)

/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/ 정규 표현식에서

([Ss]cript) 는 \2 로 참조된다.

 

아래의 표현식은 작은 따옴표나 큰 따옴표 내에 한 개 이상의 문자가 있는 경우 매치된다.

/['"][^'"]*['"]/

하지만, 이 표현식은 시작하는 따옴표와 끝나는 따옴표가 서로 같지 않아도 된다.

 

여기서 따옴표를 서로 같게 만들려면 아래와 같은 참조를 사용한다.

/(['"])[^'"]*\1/

\1은 괄호로 둘러싸인 첫번째 부분 문자열 (['"])이 매치된 것과 매치된다.

이 예제는 마치는 따옴표가 시작하는 따옴표와 같도록 강요한다.

문자 클래스 내에서는 이러한 참조를 사용할 수 없기 때문에 아래와 같이 쓸 수는 없다.

/(['"])[^\1]*\1/

 

- 4.2.2 참조 없는 그룹화 : (?:...)

(?:...) 정규 표현식은 참조를 생성하지 않는다.

/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/

(?:[Ss]cript)는 참조를 생성하지 않으므로, 여기서 \2는 (fun\w*)에 매치된다.

 

- 4.3 참조 : \n

4.2.1 과 4.2.2의 경우에서 보여졌듯이

\1, \2, \3과 같은 문자를 이용하여 그룹을 참조한다.

 

 

5. 매치 위치 지정

\b 와 같은 원소는 매치에 사용할 문자를 지정하지 않고, 매치가 일어날 수 있는 위치를 지정한다.

이 원소들은 찾을 문자열의 특정 위치에 패턴을 고정시키기 때문에 정규 표현식 앵커(anchor)라 부른다.

가장 많이 사용되는 앵커 원소는

패턴을 문자열의 시작 부분에 연결시키는 ^ 와

패턴을 문자열의 마지막에 연결시키는 $ 이다.

 

^ : 문자열의 시작 부분이나, 여러 라인을 찾는 경우에는 줄의 시작 부분에 매치.

$ : 문자열의 끝 부분이나, 여러 줄을 찾는 경우에는 줄의 끝 부분에 매치.

\b : 단어 경계의 매치.

\B : 단어 경계가 아닌 곳에 매치.

(?=패턴) : 긍정적 뒤보기 선언.

이후에 나오는 문자들이 '패턴'에 매치되어야 하지만, 매치 결과에는 나타나지 않는다.

(?!패턴) : 부정적 뒤보기 선언. 이후에 나올 문자들이 '패턴'에 매치되어서는 안 된다.

 

 

6. 플래그(flag)

정규 표현식의 나머지 문법과는 다르게 플래그는 / 문자 뒤쪽에 기술된다.

i : 패턴 매칭이 대소문자 구별없이 이루어져야 한다는 것을 의미한다.

g : 패턴 매칭이 전역적이어야 한다는 것을 의미한다. (탐색된 문자열에서 매치된 부분을 모두 얻어야 한다.)

m : 여러 줄에 걸친 패턴 매칭을 수행한다. 이 상태에서는 찾을 문자열에 줄바꿈 문자(\n)가 있다면,

^는 줄의 시작이나 문자열의 시작에 매치되고, $는 줄의 끝이나 문자열의 끝에 매치된다.

 

ex)

"java" 라는 단어 ("Java 혹은 JAVA" 등)의 첫 출현을 대소문자 구별없이 찾으려면,

대소문자를 구별하지 않는 정규 표현식인 /\bjava\b/i 를 사용할 수 있다.

그리고, 문자열에서 이 단어의 모든 출현을 찾고 싶다면

플래그 g를 추가한 /\bjava\b/gi 를 사용할 수 있다.

 

플래그 m의 경우,

패턴 /Java$/im 는 "java" 뿐만 아니라 "Java\nis fun" 에도 매치된다.

 

[출처] http://blog.naver.com/dragmove/30166159372