정규표현식(Regular Expression) 기초
정규표현식(regular expression)은 문자열 내의 특정 형태의 문자나 패턴을 찾는데 사용하거나 특정 문자나 패턴을 다른 문자나 패턴으로 대체하는데 사용되며 regex나 regexp로 불린다. 코드 가독성이 썩 뛰어나지는 않지만 정규표현식은 알아두면 유용하게 사용할 일이 종종 있다. 예를들어, 회원가입을 할 때 비밀번호를 설정하는 경우, ‘영어 대소문자, 숫자, 특수문자를 포함한 10~15자리 문자’를 입력하라는 경우가 있다고 하자. 이런 경우 입력받은 문자열의 유효성을 검사하는데에 정규표현식이 유용하게 사용될 수 있다.
정규표현식 Meta문자
정규식에서의 특수문자 목록은 다음과 같다.
특수문자
문자 | 예시 | 의미 |
---|---|---|
\ | \b | 이스케이프(escape). 다음에 올 문자가 문자열로 해석되지 않음을 의미 |
^ | ^x | 입력의 시작. 뒤의 문자로 시작함을 의미 |
$ | x$ | 입력의 끝. 앞의 문자로 끝나는 것을 의미 |
* | x* | 패턴의 반복. 앞의 문자가 0번 이상 반복되는 것을 의미. {0,}와 동일 |
+ | x+ | 패턴의 반복. 앞의 문자가 1번 이상 반복되는 것을 의미. {1,}와 동일 |
? | x? | 패턴의 존재. 앞의 문자가 0번 또는 1번 이상 등장하는것을 의미 |
. | x. | 단일 문자와 대응. ‘x.’은 xi, xj와 일치하고 ‘.x’는 ax, ex와 일치 |
| | x|y | 둘 중 하나와 대응. ‘x’ 또는 ‘y’에 대응 |
() | (x) | 캡쳐 그룹 지정. 캡처하고자 하는 패턴을 기억 |
(?:) | (?:x) | 캡쳐하지 않을 그룹 지정. 뒤에 오는 패턴을 기억하지 않음 |
(?=) | x(?=y) | lookahead. y가 뒤따라오는 x에만 대응 |
(?!) | x(?!y) | negated lookahead. y가 뒤따라오지 않는 x만 대응 |
{n} | a{2} | 앞의 표현식이 n번 나타나는 경우에 대응 |
{n,} | a{1,3} | 앞의 표현식이 n번 이상 나타나는 경우에 대응 |
{n,m} | a{1,3} | 앞의 표현식이 n번 이상, m번 이하로 나타나는 경우에 대응 |
[ ] | [xy] | 문자 셋(chracter set). 괄호 안의 모든 문자와 대응 |
[^] | [^xy] | 부정 문자 셋. 괄호 안의 문자가 아닌 어떤 문자와도 대응 |
[-] | [x-z] | 범위 문자셋. 괄호 안 문자범위의 어떤 문자와도 대응 |
escape 문자
문자 | 의미 |
---|---|
\b | word boundary. 다른 ‘단어 문자’가 앞이나 뒤에 등장하지 않는 부분에 대응 |
\B | non word boundary. 단어 경계가 아닌 부분에 대응 |
[\b] | backspace. 백스페이스(U+0008) 문자에 대응 |
\d | digit. 숫자에 대응. [0-9]와 동일 |
\D | non digit. 숫자가 아닌 것에 대응. [^0-9]와 동일 |
\n | new line. 줄 바꿈 (U+000A) 문자에 대응 |
\r | carriage return. 캐리지 리턴(U+000D) 문자에 대응 |
\s | space. 공백 문자에 대응 |
\S | non space. 공백 문자가 아닌 것에 대응 |
\t | tab. 탭 문자(U+0009)에 대응 |
\v | vertical tab. 수직 탭(U+000B) 문자에 대응 |
\w | word. ‘알파벳 + 숫자 + _’ 중의 한 문자임을 의미 |
\W | non word. ‘알파벳 + 숫자 + _’ 가 아닌 문자를 의미 |
\n | 정규식 내부의 n번째 괄호에서 대응된 부분에 대한 역참조 |
플래그(flag)
정규표현식을 정의할 때 플래그를 통해 검색 조건을 설정을 할 수 있다.
문자 | 뜻 | 의미 |
---|---|---|
i | ignore case | 대소문자 구분 없이 검색 |
g | global | 문자열 내의 모든 패턴 검색(한 번 이상 검색) |
m | multi line | 문자열의 행이 바뀌어도 계속 검색 |
Javascript에서의 정규표현식
Javascript에서는 정규표현식을 ‘/’로 감싼 리터럴 방식으로 정의하거나 RegExp()생성자를 이용해서 생성할 수 있다.
//리터럴을 이용한 정의
const myRegexp1 = /^a/;
//생성자를 이용한 생성
const myRegexp2 = new RegExp('^a');
플래그 또한 두 가지 방법 모두 정의할 수 있다.
//리터럴을 이용한 플래그 정의
const myRegexp1 = /^a/g;
//플래그를 두번째 매개변수로 하는 생성자를 이용한 생성
const myRegexp2 = new RegExp('^a', 'ig');
References
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D