Notice
suyeonme
[Regex] 정규 표현식(Regular Expression) 본문
정규 표현식을 자주 사용을 안 하다보니, 사용할 때마다 디테일한 문법들이 기억이 잘 나지 않아서 그 때 그 때 필요한 부분을 찾아서 사용을 하곤한다.
오늘은 복습 차원에서 정규 표현식을 다시 정리해보았다.
1. 정규 표현식(Regular Expression)이란?
정규 표현식은 문자열에서 특정 문자 조합을 찾기 위한 패턴이다. 정규 표현식은 아래의 두 가지 방법으로 만들 수 있다.
1.1. Literal
- 스크립트를 불러올 때 컴파일
- 바뀌지 않는 정적인 패턴의 경우 사용
const regex = /ab+c/
1.2. Regex Constructor
- 런타임에 컴파일
- 동적으로 바뀌는 패턴의 경우 사용
const regex = new RegExp('ab+c');
// 동적으로 값을 할당하는 경우
const regex = new RegExp(`${pattern1}|${pattern2}`, 'gi');
str.match(regex);
2. 문법 (Pattern + Flag)
- 정규 표현식은 /로 시작하여 /로 끝난다.
- 문자열의 따옴표("")는 생략한다.
- pattern과 flag로 구성된다.
- 메타 문자를 텍스트 자체로 표현하려면, 해당 메타 문자 앞에 escape 문자(\, backslash)를 사용한다.
2.1. Pattern, Meta 문자
- escape 문자 + 대문자는 부정(NOT) 케이스이다.
Pattern | Description | 예시 |
^ | 줄의 시작에서 일치 | ^a (a로 시작하는 문자열) |
$ | 줄의 끝에서 일치 | a$ (a로 끝나는 문자열) |
a|b | a 또는 b와 일치 (index가 작은 것을 먼저 반환) | |
* | 0회 이상 연속으로 반복되는 문자와 가능한 많이 일치 | a* (a가 0번 이상 반복) |
*? | 0회 이상 연속으로 반복되는 문자와 가능한 적게 일치 | a? (a가 존재하거나 존재하지 않음) |
+ | 1회 이상 연속으로 반복되는 문자에 가능한 많이 일치 | a+ (a가 1번 이상 반복) |
+? | 1회 이상 연속으로 반복되는 문자에 가능한 적게 일치 | |
? | 없거나 1회 가능한 많이 일치 | |
?? | 없거나 1회 가능한 적게 일치 | |
() | capture할 그룹 | (\w+) 하나 이상의 단어 문자를 탐색 |
(?:) | capture하지 않는 그룹 | |
(?=) | 앞쪽 일치, lookahead | |
(?!) | 부정 앞쪽 일치, negative lookahead | |
(?<=) | 뒤쪽 일치, lookbehind | |
[ab] | a 또는 b와 일치 (메타 문자는 []안에서 특수 문자로 취급되지 않음) | |
[a-z] | a부터 z사이의 문자 구간에 일치 | |
[A-Z] | A부터 Z사이의 문자 구간에 일치 | |
[0-9] | 0부터 9사이의 숫자 구간에 일치 | |
[^ab] | a 또는 b가 아닌 문자에 일치, NOT | |
a{n} | a를 n번 반복한 문자에 일치 | a{3} |
a{n,} | a를 n번 이상 반복한 문자에 일치 | a{3,} |
a{n,m} | a를 n번 이상 m번 이하 반복한 문자에 일치 | a{3,5} |
\ | escape 문자 | |
\b (boundary) | 63개 문자에 일치하는 경계 | |
\B | 63개 문자가 아닌 나머지 문자에 일치하는 경계 (영문 대소문자 52개 + 숫자 10개 + _(underscore)) | |
\d (digit) | 숫자에 일치 | |
\D | 숫자가 아닌 문자에 일치 | |
\s (space) | 공백에 일치 (space, tab등) | |
\S | 공백이 아닌 문자에 일치 | |
\w (word) | 63개 문자에 일치 | |
\W | 63개 문자가 아닌 나머지 문자에 일치 | |
\u (unicode) | 유니 코드 문자에 일치 | |
\n | 줄바꿈 문자에 일치 |
2.1.1 Escape 문자
escape가 필요한 메타 문자는 아래와 같다.
- [], brackets
- (), parentheses
- {}, curly braces
- *, +, ?, |, operators
- ^, $, anchors
- ., \
예를 들어, \(slash)를 텍스트 그대로 표현하기 위해서는 \/와 같이 앞에 escape 문자를 작성한다.
2.1.2 Capturing Group
Capturing Group을 사용하면, 일치(match)된 문자열에서 일부를 추출할 수 있다. 예를 들면, suyeon@gmail.com에서 @앞 이메일 ID를 추출하거나, 도메인의 서브 도메인을 추출하는등의 행위가 가능하다.
- 하나의 캡쳐링 그룹 뒤에 quantifier를 넣으면, 캡쳐링 그룹 전체의 반복을 나타낸다. (하나의 문자 뒤에 quantifier를 넣으면, 해당 문자의 반복)
- (?:)는 캡쳐링하지 않는 캡쳐링 그룹이다.
const str = 'Gogogo now!';
// capture group vs non-capture group
str.match(/(go)+/ig); // ['Gogogo']
str.match(/go+/ig) ); // ['Go', 'go', 'go']
2.2 Flag
- 정규 표현식의 옵션으로 검색 방식을 설정한다.
- 순서와 상관없이 여러개의 플래그를 설정할 수 있다.
Flag | Description |
g (global) | 패턴과 일치하는 모든 검색 결과를 배열로 반환 |
i (ignorecase) | 대소문자를 구분하지 않음 |
m (multi line) | 문자열의 행이 바뀌어도 패턴을 검색 |
y (sticky) | 문자 내 특정 위치에서 패턴을 검색 |
예를 들어, ig와 같이 작성하면, 대소문자 구분없이 패턴과 일치하는 모든 문자를 배열로 반환한다.
3. RegExp의 메서드(method)
- match()사용시 g 플래그를 적용하면, match 결과 내에 포함된 캡처는 반환하지 않는다.
Comments