[JS][정규 표현식] set과 range
Set
정규 표현식에는 꺾쇠괄호 []을 사용하기도 한다. 이 때 []은 해당 괄호 안의 문자들 중 하나라도 일치하는 부분 문자열을 찾을 때 사용한다.
예를 들어 [abc]와 같이 있다면, 이는 검색할 원문에서 ‘a’, ‘b’, ‘c’ 중 하나라도 만족하는 문자를 검색하겠다는 뜻이다. 이렇게 괄호 []와 그 내부에 정규식이 있는 형태 ([abc])를 set이라 한다. 이 set은 오로지 한 글자만 찾는다.
console.log("Bow wow".match(/[bw]ow/gi));
let pattern = /a[bc]d/gi;
console.log("abcd".match(pattern));
console.log("abd".match(pattern));
예제 1-1
[ 'Bow', 'wow' ]
null
[ 'abd' ]
예제 1-1 출력결과
위 예제의 패턴 /a[bc]d/
은 abd 또는 acd인 부분 문자열만을 검색 결과로 반환할 것이다. 만약 “abcd”가 검색 결과에 포함되려면, /a[bc][bc]d/
이런 식으로 작성해야 할 것이다.
Range
만약 영어 알파벳을 원문에서 찾고자 한다면 set을 이용한다면 [abcdefghijklmnopqrstuvwxyz] 처럼 사용할거라고 생각했을지도 모른다. 하지만 이는 너무 길다. 이 대신 범위(range)를 나타내주는 하이픈(-) 기호를 두 문자 사이에 적으면 된다. 즉, [a-z]라고 하면 이는 영어 알파벳 a부터 z까지의 모든 문자들을 검색 대상에 포함시킨다는 뜻이다. 이 범위 지정은 여러 번 할 수 있다. 즉, 16진수를 찾기 위해 [0-9A-F]와 같이 범위를 두 번 이상 지정할 수도 있다.
눈치 챘을지도 모르겠지만, 이렇게 하이픈을 이용하여 범위를 지정하는 문자 set은 이전에 보았던 문자 클래스들과 동일한 면이 있다.
문자 클래스 | 문자 set |
---|---|
\d | [0-9] |
\w | [a-zA-Z0-9_] |
\s | [\t\n\v\f\r] |
위 테이블에서 같은 행에 있는 두 문자들은 모두 서로 같은 뜻을 지닌다.
다음은 하이픈을 이용한 예제이다.
let source = "(010)-1234-5678";
let result = source.match(/[0-9]/g);
console.log(result);
console.log(result.join(''));
예제 2-1
[
'0', '1', '0', '1',
'2', '3', '4', '5',
'6', '7', '8'
]
01012345678
예제 2-1 출력결과
범위 제외하여 검색하기
set 내에서 쓸수 있는 또 다른 특수 문자가 있다. 바로 캐럿(caret, ^) 문자이다. 이 문자를 set 내부에서 맨 처음에 위치시킨다. 해당 문자는 set 괄호 내부에 있는 문자들을 제외한 나머지 문자들을 검색한다는 뜻이다. 예를 들어, [^0-9]라고 표기한 경우, 이는 숫자를 제외한 나머지 문자들만을 검색하겠다는 뜻이며, \D와도 같다.
let source = "2+3-12*5/2";
console.log(source.match(/[^\d\w\s]/gi));
예제 3-1
[ '+', '-', '*', '/' ]
예제 3-1 출력결과
set에서의 escape
패턴에서 특수 문자로서의 의미가 아닌 리터럴 문자로서 사용하기 위해 그 문자 앞에 백슬래시(\)를 붙였었다. set 내부에서도 리터럴 문자로 사용하기 위해 백슬래시 사용을 고려할 수도 있겠다. 물론 가능하다. 하지만 set 내부에서는 특정 케이스들을 제외하면 대부분 escape 문자 \ 을 쓰지 않고 그대로 써도 자동으로 리터럴 문자로 해석된다.
let source = "2+3-12*(5/2)";
console.log(source.match(/[-+().^*]/g));
예제 4-1
[ '+', '-', '*', '(', ')' ]
예제 4-1 출력결과
위 예제에서 match()
메서드 내부에 전달된 정규식을 보면, 각각의 문자들은 대부분 특수 문자로서의 의미를 가지는 문자들이다. 여기서 백슬래쉬 기호를 사용하지 않았음에도 해석 시에는 리터럴 문자로 해석되어 검색된 것을 볼 수 있다.
각 문자들에 대해, set 내부에서 사용되면 다음의 특징들을 가진다.
- 마침표(.), +, 괄호( () ) 이 문자들은 리터럴로 인식된다.
- 하이픈(-)은 [-0], [a-]와 같이 문자와 문자 사이에 위치하지 않고 맨 앞 또는 맨 뒤에 위치할 경우 리터럴로 인식된다.
- 캐럿(^)은 set 내부에서 맨 앞에 위치하지 않을 때 리터럴 문자가 된다.
물론 그럼에도 의심이 간다면, 안전하게 명시적으로 백슬래시를 넣어도 된다. 위 예제의 경우, [\-\+\(\)\.\^\*]
와 같이 쓸 수 있겠다.
References
This content is licensed under
CC BY-NC 4.0
댓글남기기