플래그
g : 모든 결과 리턴
i : case-insensitive
m : multi line
- 줄이 바뀌어도 계속 검색
^, $가 각 줄마다 적용됨
s : .이 \n도 포함하도록 설정
u : 유니코드 전체 지원
y : sticky 모드 활성화
한 문자 매칭
- : 문자 범위 지정
a-zA-Z(알파벳 하나), ㄱ-ㅎ가-힣(한글 하나), 0-9(숫자 하나)
. : 줄바꿈 제외 한 문자
\d : 숫자
\w : 언더바 포함 알파벳, 숫자
a-zA-Z0-9_와 동일
\W : not \w
\s : space
\*, \^, \&, \!, \?, ...
\b : 문자(알파벳, 숫자, _)와 비문자 사이의 경계
\B : 문자와 문자, 비문자와 비문자 사이의 경계
\x : 16진수 문자
\c : 제어 문자
\f : FF(U+000C)
\n : LF(U+000A)
\r : CR(U+000D)
\t : 탭(U+0009)
검색 패턴
| : OR(a|b)
[] : 괄호 안의 문자들 중 하나
/abc/ : abc를 포함
/[abc]/ : a or b or c를 포함
[^c] : 괄호 안의 문자를 제외
^str : 시작 문자열
str$ : 종료 문자열
반복 패턴
? : 0≤n≤1
- 다른 quantifier 뒤에 붙으면 최솟값으로 고정함
* : 0≤n
+ : 1≤n
{k} : n=k
*? : {0}과 동일
+? : {1}과 동일
{k,} : k≤n
{m, M} : m≤n≤M
그룹 패턴
() : 그룹화 + 캡처
(?:패턴) : 그룹화
{pattern}(?=) : 앞쪽 일치(Lookahead)
/\w{3}(?=g)/g : 길이가 3인 \w 문자열을 선택하는데 g 앞에 위치한 문자열들만 매치
(?=g)asdf과 같이 수식해주는 내용이 없으면 안됨
(?!) : 부정 앞쪽 일치(Negative Lookahead)
(?<=) : 뒤쪽 일치(Lookbehind)
- Lookahead와 반대로 뒤쪽을 수식하기 때문에 뒤에 패턴이 없으면 안됨
(?<!) : 부정 뒤쪽 일치(Negative Lookbehind)
정규식 그룹화와 캡처
1
2
3
4
5
6
7
| "abcabcabc".match(/abc+/); // 'abc'
"abbbbbcabcccccabccc".match(/abc+/); // 'abccccc'
"abcabcabc".match(/(abc)+/); // 'abcabcabc', 'abc'
"abbbbbcabcccccabccc".match(/(abc)+/); // 'abc', 'abc'
"abcabcabcccabcabc".match(/(abc)+/); // 'abcabcabc', 'abc'
"iamasdfasitis".match(/iam(.*)asitis/); // 'iamasdfasitis', 'asdf'
"abcabcabc".match(/(?:abc)+/); // 'abcabcabc'
|
()로 그룹화하여 문자 하나 대신 사용 가능
- 패턴에서 그룹화된 표현식을 캡처해놓은 후, 전체 패턴으로 한 번 검색하고 캡처된 그룹 표현식들을 사용해서 다시 검색함
(?:)으로 캡처 기능 비활성화 가능
Greedy/Lazy quantifier
- Greedy quantifier : 패턴을 만족하는 가장 큰 부분을 찾음(
*, +, {n,})
- Lazy quantifier : 패턴을 만족하는 가장 작은 부분을 찾음(
*?, +?, {n,}?)
1
2
3
4
5
6
7
8
9
| str = "<div> <p>First</p> <p>Second</p></div>";
str.match(/<p>(.+)<\/p>/);
// '<p>First</p> <p>Second</p>', 'First</p> <p>Second'
str.match(/<p>(.+)<\/p>/g);
// '<p>First</p> <p>Second</p>'
str.match(/<p>(.+?)<\/p>/);
// '<p>First</p>', 'First'
str.match(/<p>(.+?)<\/p>/g);
// '<p>First</p>', '<p>Second</p>'
|
- 위의 예시처럼 고정된 개수의 괄호는 매치할 수 있지만, 임의의 괄호 매치는 불가능함
- 정규식이 regular language이기 때문
- 괄호 매치와 같은 문제를 풀기 위해선 context-free language이어야 함
Leave a comment