정규 표현식
정규 표현식은 일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어이다. 이러한 정규 표현식은 문자열을 대상으로 패턴 매칭 기능을 제공한다. 패턴 매칭 기능이란 특정 패턴과 일치하는 문자열을 검색하거나 추출 또는 치환할 수 있는 기능이다.
만약 정규 표현식을 사용하지 않는다면 반복문과 조건문을 통해 각 문자를 체크해야하지만 정규 표현식을 사용하면 반복문과 조건문 없이 패턴을 정의하고 테스트하는 것이 가능하다. 다만 정규 표현식은 주석이나 공백을 허용하지 않고 여러 가지 기호를 사용하기 때문에 가독성이 좋이 않다.

일반적으로 정규 표현식은 정규 표현식 리터럴을 사용하며 정규 표현식 리터럴은 패턴과 플래그로 구성된다.
1
2
3
4
5
6
7
8
9
const target = 'Is this all there is?';
// 패턴 : is
// 플래그 : i, 대소문자 구별하지 않고 검색
const regexp = /is/i;
regexp.test(target); // true
RegExp 메서드
RegExp.prototype.exec
exec 메서드는 인수로 받은 문자열에 대한 정규식 패턴을 검색해서 매칭 결과를 배열로 반환한다. 매칭 결과가 없으면 null을 반환한다.
1
2
3
4
5
6
const target = 'Is this all there is?';
const regExp = /is/;
regExp.exec(target); // ["is", index: 5, input: "Is this all there is?", groups: undefined]
exec 메서드는 플래그를 지정해도 첫 매칭 결과만 반환하므로 주의해야 한다.
RegExp.prototype.test
test 메서드는 패던 검색을 해서 매칭 결과를 불리언으로 반환한다. input의 형식을 검사할 때 사용한다.
1
2
3
4
5
6
const target = 'Is this all there is?';
const regExp = /is/;
regExp.test(target); // true
String.prototype.match
String 표준 빌트인 객체가 제공하는 match 함수이다. 정규식과의 매칭 결과를 배열로 반환한다. match 함수는 exec 함수와 다르게 모든 패턴을 검색하는 g 플래그를 지정하면 모든 매칭 결과를 배열로 반환한다.
1
2
3
4
5
6
const target = 'Is this all there is?';
const regExp = /is/g;
target.match(regExp); // ["is", "is"]
플래그
플래그는 정규식 검색 방식을 설정하기 위해 사용한다. 플래그는 총 6개가 있다. 플래그는 옵션으로 선택적으로 사용이 가능하며, 순서와 상관없이 하나 이상의 플래그 설정이 가능하다.
| 플래그 | 설명 |
|---|---|
| i | 대소문자 구분 없이 검색 |
| g | 패턴과 일치하는 모든 것을 검색, g 플래그가 없을 경우 일치하는 첫 번째 결과만 반환 |
| m | 다중 행 모드를 활성화, 문자열의 행이 바뀌더라도 패턴 검색을 계속함 |
| s | 개행문자와 .이 일치함 |
| u | 유니코드 전체를 지원함 |
| y | 문자 내 특정 위치에서 검색을 진행하는 sticky 모드를 활성화 |
패턴
임의의 문자열 검색
.은 임의의 문자 한 개를 의미한다. …의 경우 문자의 내용과 상관없이 3자리 문자열과 매치한다.
1
2
3
4
5
6
const target = 'Is this all there is?';
const regExp = /.../g;
target.match(regExp); // ["Is ", "thi", "s a", "ll ", "the", "re ", "is?"]
반복 검색
{m,n}은 앞선 패턴이 최소 m번, 최대 n번 반복되는 문자열을 의미한다. 콤마 뒤에 공백은 없어야한다.
{n}은 앞선 패턴이 n번 반복되는 문자열을 의미한다. {n,n}과 의미가 같다.
{n,}은 패턴이 최소 n번 이상 반복되는 문자열을 의미한다.
+는 패턴이 최소 한번 이상 반복되는 문자열로 {1,}과 같다.
?는 패턴이 최대 한번 이상(0번 포함) 반복되는 문자열을 의미한다. 즉, {0,1}과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const target_1 = 'A AA B BB Aa Bb AAA';
const regExp_1 = /A{1,2}/g;
const regExp_2 = /A{2}/g;
const regExp_3 = /A{2,}/g;
const regExp_4 = /A+/g;
target_1.match(regExp_1); // ["A", "AA", "A", "AA", "A"]
target_1.match(regExp_2); // ["AA", "AA"]
target_1.match(regExp_3); // ["AA", "AAA"]
target_1.match(regExp_4); // ["A", "AA", "A", "AAA"]
const target_2 = 'color colour';
const regExp_5 = /colou?r/g;
// colo 다음 u가 최대 한번(0번 포함) 이상 반복되고 'r'이 이어지는 문자열 검색
target_2.match(regExp_5); // ["color", "colour"]
OR 검색
1
2
3
4
5
6
7
const target = 'A AA B BB Aa Bb';
const regExp = /A|B/g;
// A 또는 B
target.match(regExp); // ["A", "A", "A", "B", "B", "B", "A", "B"]
분해되지 않은 문자열을 검색할 때 +를 조합하면 된다.
1
2
3
4
5
6
const target = 'A AA B BB Aa Bb';
const regExp = /A+|B+/g;
target.match(regExp); // ["A", "AA", "B", "BB", "A", "B"]
OR 패턴은 간단히 대괄호로 표현할 수 있다. 범위를 지정할 경우 대괄호 내에 -를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const target_1 = 'A AA B BB Aa Bb';
const target_2 = 'AA BB ZZ Aa Bb';
const target_3 = 'AA BB Aa Bb 12';
const target_4 = 'AA BB 12,345';
const regExp_1 = /[AB]+/g;
const regExp_2 = /[A-Z]+/g;
const regExp_3 = /[A-Za-z]+/g;
const regExp_4 = /[0-9]+/g;
const regExp_5 = /[0-9,]+/g;
target_1.match(regExp_1); // ["A", "AA", "B", "BB", "A", "B"]
target_2.match(regExp_2); // ["AA", "BB", "ZZ", "A", "B"]
target_3.match(regExp_3); // ["AA", "BB", "Aa", "Bb"]
target_4.match(regExp_4); // ["12", "345"]
target_4.match(regExp_5); // ["12,345"]
[0-9]는 숫자를 의미하며 \d와 같은 표현이다. \D는 \d와 반대로 문자를 의미한다.
1
2
3
4
5
6
7
8
9
10
const target = 'AA BB 12,345';
let regExp = /[\d,]+/g;
target.match(regExp); // ["12,345"]
regExp = /[\D,]+/g;
target.match(regExp); // ["AA", "BB", ","]
\w는 알파벳, 숫자, 언더스코어를 의미한다. 즉, [A-Za-z0-9_]와 같다. \W는 \w와 반대로 알파벳, 숫자, 언더스코어를 제외한 문자를 의미한다.
1
2
3
4
5
6
7
8
9
10
11
const target = 'Aa Bb 12,345 _$%&';
let regExp = /[\w,]+/g;
target.match(regExp); // ["Aa", "Bb", "12,345", "_"]
regExp = /[\W,]+/g;
target.match(regExp); // [" ", " ", ",", " $%&"]
NOT 검색
[…] 안의 ^은 not의 의미를 가진다.
1
2
3
4
5
6
const target = 'AA BB 12 Aa Bb';
const regExp = /[^0-9]+/g;
target.match(regExp); // ["AA BB ", " Aa Bb"]
시작 위치와 끝 위치
[…] 밖의 ^은 문자열의 시작을 의미한다. $는 문자열의 마지막을 의미한다.
1
2
3
4
5
6
7
8
9
10
const target = 'https://poiemaweb.com';
// https로 시작하는지 검사
const regExp_1 = /^https/;
// com으로 끝나는지 검사
const regExp_2 = /com$/;
regExp_1.test(target); // true
regExp_2.test(target); // true