티스토리 뷰
정규표현식
- RegExp 생성자로 생성하거나 리터럴 방법으로 생성가능하다.
xxxxxxxxxx
// 리터럴 방식
const re = /ab+c/;
// 생성자함수
const re = new RegExp("ab+c");
- 정규식 패턴이 바뀌는 경우 생성자 함수를 사용하여 동적으로 정규식을 만들어 준다.
정규식 패턴
- 단순한 문자열로 만들거나 특수문자와 단순 문자열의 조합으로 패턴을 생성할 수 있다.
단순 문자열
- 직접 찾고자하는 문자열로 정규식을 구성한다.
xxxxxxxxxx
const re = /apple/;
const result = re.exec("banana apple");
// return
[ 'apple', index: 7, input: 'banana apple', groups: undefined ]
특수문자를 사용한 패턴
- 하나 이상의 문자를 찾거나 다양한 문자열을 찾기 위해 사용된다.
xxxxxxxxxx
const re = /ab*c/;
const result = re.exec("banana abbbbbbbbbcde");
// return
[ 'abbbbbbbbbc', index: 7, input: 'banana abbbbbbbbbcde', groups: undefined ]
- 위의 정규표현식은 a뒤에 0개 이상의b가 나오고 뒤에 c가 이어지는 문자열을 찾는다.
정규표현식에서 특수문자 종류와 의미
1 \
- 단순문자 앞에서 \
- 단순문자 앞의 \는 새로운 의미를 가지게 된다.
/a\d/
의\d
는 d를 의미하지 않고 0부터 9까지의 숫자를 의미한다.
- 특수문자 앞에서 \
- 특수문자 앞의 \는 해당 특수문자를 단순문자로서 해석하게 된다.
/a\*/
의\*
로 인하여aaaaaaaaa
와 매칭되지 않고a*
와 매칭된다.
2 ^
- 입력의 시작 문자열에 매칭된다.
- Multi-line 플래그가 참으로 설정되어 있으면 줄 바꿈 문자 바로 다음 문자에도 매칭된다.
/^A/
는 "An e"의 첫번째 A와 매칭되지만 "an A"와는 매칭되지 않는다.
3 $
- 입력의 끝 문자열에 매칭된다.
- Multi-line 플래그가 참으로 설정되어 있으면 줄 바꿈 바로 전 문자에도 매칭된다.
4 *
- 0번 이상 반복되는 문자열에 매칭된다.
- {0,}과 동일하다.
- /bo*/은 "A ghost booooed"의 "boooo"과 매칭된다.
- /bo*/은 "A bird warbled"의 'b'에 매칭된다.
- /o*/에서 문자열에 o가 존재하지 않으면 빈 문자가 매칭된다.
xxxxxxxxxx
const re = /o*/;
const result = re.exec("banana abbbbbbbbbcde");
// return
[ '', index: 0, input: 'banana abbbbbbbbbcde', groups: undefined ]
5 +
- 1번 이상 반복되는 문자열에 매칭된다.
- {1,}과 동일하다.
6 ?
0~1번 반복되는 문자열에 매칭된다.
{0, 1}과 동일하다.
*, +, ?, {} 패턴 뒤에 ? 패턴을 사용하면, 가능한 가장 적은 문자열을 매칭시킨다.
- /\d+/는 "123abc"에 "123"과 매칭된다.
- /\d+?/의 경우는 "123abc"에 '1'만 매칭된다.
7 .
개행 문자를 제외한 모든 단일 문자와 대응된다.
/.n/은 "nay, an apple is on the tree"에서 'an'과 'on'에 대응되지만, 'nay' 에는 대응되지 않는다.
- nay는 시작이므로 개행문자가 삽입되어 있다.
xxxxxxxxxx
const re = /.n/;
re.exec("nay, an apple is on the tree");
// return
[ 'an',
index: 5,
input: 'nay, an apple is on the tree',
groups: undefined ]
8 (x)
- x에 일치하고 일치한 것을 기억한다.
- 매칭된 값이 기억된다.
xxxxxxxxxx
const re = /(foo) (bar)/;
re.exec("foo bar test");
// return
[ 'foo bar',
'foo',
'bar',
index: 0,
input: 'foo bar test ',
groups: undefined ]
8 (?:x)
- x에 일치하지만 일치한 것을 기억하지 않는다. 비포획 괄호.
xxxxxxxxxx
const re = /(?:abc)+/;
re.exec("abcabcabc");
// return
[ 'abcabcabc',
'abc',
index: 0,
input: 'abcabcabc',
groups: undefined ]
- 괄호안의 문자가 반복되는 것을 매칭하고 싶을 때 사용
9 x(?=y)
- y가 뒤따라오는 x에만 매칭된다. lookahead
- /foo(?=bar)/는 "foobar"의 "foo"에 매칭된다.
10 x(?!y)
- y가 뒤따라 오지 않는 x에만 매칭된다. negated l ookahead.
- /\d+(?!.)/는 "3.141"의 "141"에 매칭된다.
11 x|y
- x 또는 y에 매칭된다.
12 {n}
- 앞에 오는 문자가 n번 나타날 경우 매칭된다.
13 {n, m}
- 앞에 오는 문자가 n ~ m번 나타날 경우 매칭된다.
14 [xyz]
문자셋(Character set)을 말한다.
점(.)이나 별표(*)와 같은 특수 문자는 문자셋에서는 단순 문자로 인식된다.
하이픈(-)을 이용하여 문자의 범위를 지정 할 수 있다.
/[a-d]/는 "brisket"의 'b'와 매칭된다.
/[a-z.]+/는 "test.i.ng"의 문자열 전체, "test.i.ng"과 매칭된다.
- []안에 a-z를 만족하는 문자이거나 .인 경우에서 +로 인하여 1번 이상 반복하는 문자열에 매칭되므로
15 [ ^xyz]
- 음의 문자셋(negated character set) 또는 보수 문자셋(complemented character set)을 말한다.
- [안에 있지 않은 문자열과 매칭된다.]
16 [\b]
- 백스페이스와 매칭된다.
- 백스페이스 문자에 일치 시키려면 대괄호를 이용해야 한다.
17 \b
- 단어의 경계를 말한다.
- /\bm/은 "moon"의 m과 매칭된다.
- /oo\b/는 "moon"과 매칭되지 않는다. (문자열의 끝이 o가 아니기 때문에)
- /n\b/는 "moon"의 n과 매칭된다.
- 단어의 앞과 뒤라고 생각하면 된다.
xxxxxxxxxx
const re = /\bb/
re.exec("moon bd");
// return
[ 'b', index: 5, input: 'moon bd', groups: undefined ]
18 \B
단어의 경계가 아닌 곳을 의미한다.
/\B../은 "moon"의 "oo"와 매칭된다.
- 경계가 아닌 m과 .이 단일문자를 의미하는데 두개 있으므로
19 \d
- 숫자와 매칭된다.
- [0-9]와 동일하다.
20 \D
- 숫자가 아닌 문자와 매칭된다.
- [^0-9]와 동일하다.
21 \n
- 줄 바꿈 문자에 매칭된다.
22 \r
- 캐리지 리턴 문자에 대응된다.
- \n 가 새줄을 만들어 주는 것이면, \r은 새로운 줄로 커서를 옮기는 것이다.
22 \s
- 스페이스, 탭, 폼피드, 줄 바꿈 문자등을 포함한 하나의 공백 문자에 매칭된다.
[ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
와 동일하다./\s\w*/
는 "foo bar."의 ' bar'에 매칭된다.
23 \S
- 공백 문자가 아닌 하나의 문자에 매칭된다.
[^ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
. 와 동일하다./\S\w*/
는 "foo bar."의 'foo' 에 매칭된다.
24 \t
- 탭 문자에 매칭된다.
25 \w
- 밑줄 문자를 포함한 영숫자 문자에 매칭된다.
[A-Za-z0-9_]
와 동일하다./\w/
는 "apple,"의 'a' 에 대응되고, "$5.28,"의 '5'에 대응되고,"3D."의 '3'에 대응된다.
26 \W
- 단어 문자가 아닌 문자에 매칭된다.
27 \n (개행과 다름, n은 양의 정수)
정규식 안 n번 괄호의 최근 일치 부분의 역참조 이다.
/(foo) (bar) \1 \2/은 "foo bar foo bar"에 "foo bar foo bar"이 매칭된다.
- \n 패턴은 괄호로 기억된 값을 참조하고 있다.
\1은 첫번째 괄호로 매칭된 foo 값을 나타내고, \2는 두번째 괄호로 매칭된 bar를 나타낸다.
/(foo) (bar) \1 \2/ 패턴은 /(foo) (bar) foo bar/ 패턴과 동일하다.
28 \0
- Null 문자와 매칭된다.
정규표현식 사용하기
RegExp와 String에 정의되어 있는 메소드를 사용하여 정규표현식을 사용할 수 있다.
RegExp 메소드
exec
- 매칭된 문자열이 있다면 매칭된 값의 배열을 리턴하고, 없다면 null을 리턴한다.
test
- 매칭된 문자열이 있으면 true를 리턴하고, 없다면 false를 리턴한다.
String 메소드
match
- 매칭된 문자열이 있다면 매칭된 값의 배열을 리턴하고, 없다면 null을 리턴한다.
search
- 매칭된 문자열이 있다면 매칭된 문자열의 인덱스를 리턴하고, 매칭된 문자열이 없다면 -1를 리턴한다.
Replace
- 매칭된 문자열을 찾아 매칭된 문자열을 변경한다.
split
- 매칭된 문자열을 찾아 그 문자열을 기준으로 문자열을 나눈다.
정규식 플래그
- 정규식뒤에 이어서 쓰면 된다. Ex) /abc/g
- 생성자 생성시 인자로 넘겨줌으로써 설정 할 수 도 있다.
xxxxxxxxxx
var re = new RegExp("pattern", "flags");
- 정규식을 처음 정의할 때, 설정해야 한다.
- 그 이후에 플래그를 추가하거나 삭제할 수 없다.
- 플래그를 중첩해서 사용가능하다. Ex) /abc/gi
g
- 전역검색.
- 매칭되는 모든 문자열을 가져올 수 있다.
xxxxxxxxxx
re = /\w+\s/g;
str = 'a b c d';
array = str.match(re);
// return
[ 'a ', 'b ', 'c ' ]
i
- 대소문자 구별 없이 검색
m
- Multi-line 검색. 시작 혹은 끝 문자 탐색(^ and $)이 다중행에 적용되도록 한다.
y
- 검색 위치 조정가능
xxxxxxxxxx
const str = 'banana apple grape';
const re = /apple/y;
re.lastIndex = 7;
re.exec(str); // apple과 매칭됨
re.lastIndex = 10;
re.exec(str); // 매칭되지 않음
re.lastIndex; // 0 (매칭되지 않을 경우 0으로 초기화)
// return
[ 'apple',
index: 7,
input: 'banana apple grape',
groups: undefined ]
null
0
참고사이트
'Javascript' 카테고리의 다른 글
[Javascript] Canvas API (0) | 2019.08.02 |
---|---|
[Javascript] Call Stack, Event Loop, Event Queue 동작원리 (0) | 2019.07.31 |
댓글