# 정규표현식 기본 정의
/ 와 / 사이에 정규표현식 리터럴을 기술한다.
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" 에도 매치된다.