자바스크립트 정규표현식
2018-03-06
1. 정규식 만들기
자바스크립트의 정규식은 RegExp 클래스이다. RegExp 생성자로도 정규식을 만들 수 있지만 간편한 리터럴 문법도 있다. 정규식 리터럴은 슬래시도 감싼 형태이다. RegExp 생성자를 써야만 할 경우가 아니면 더 간편한 리터럴 문법을 쓰는게 좋다. 하지만 정규식은 HTML처럼 매우 복잡한 것을 검색하기에는 알맞지 않다. 제대로 동작하는 것이 필요하다면 전용 파서를 찾아야 한다.
const reg1 = /going/;
const reg2 = new RegExp("going");
2. 정규식 검색
- String.prototype.match와 RegExp.prototype.test를 자주 쓴다.
- 정규식 검색 예제
3. 정규식을 사용한 문자열 교체
4. 입력 소비
X J A N L I O N A T U R E C O N P
- 위의 문자열 중 LION, ION, NATURE, ECO를 찾는다면 정규식은 찾는 문자 중 X로 시작하는 단어가 없으니 X를 소비(consume)하고, L에 도착하면 L은 일치할 가능성이 있으므로 소비하지 않는다. 계속해서 I, O, N을 만나면 LION을 찾았으므로 L,I,O,N은 소비된다. 하지만 이미 N이 소비되었으므로 NATURE는 찾지 못한다.
- 문자열 왼쪽에서 오른쪽으로 진행한다
- 일단 소비한 글자로는 다시 돌아오지 않는다
- 한번에 한 글자씩 움직이며 일치하는 것이 있는지 확인한다
- 일치하는 것을 찾으면 해당하는 글자를 한꺼번에 소비한 후 다음 글자로 진행한다 (정규식에 /g 플래그를 쓸 경우 해당)
6. 정규식 문자셋
문자셋 | 동등한 표현 | 설명 |
---|---|---|
\d | [0-9] | 숫자만 |
\D | [^0-9] | 숫자만 빼고 |
\s | [ \t\v\n\r] | 탭, 스페이스, 새로 탭, 줄바꿈 포함 |
\S | [^ \t\v\n\r] | |
\w | [a-zA-Z_] | ”-“이나 “.”는 포함되지 않으므로 도메인 이름이나 CSS 클래스 등은 찾을 수 없다 |
\W | [^a-zA-Z_] |
7. 정규식 예제
8. 반복
- 반복 메타 문자는 얼마나 많이 일치해야 하는지 지정할 때 쓴다.
- 만약 숫자 여러 개를 찾아야 한다면?
const match = str.match(/[0-9][0-9]/); // 두 자리 숫자
const match = str.match(/[0-9]+/); // 숫자 하나 이상
문자셋 | 설명 | 예제 |
---|---|---|
{n} | 정확히 n개 | /\d{5}/ 숫자 5자리 |
{n,} | 최소한 n개 | /\d{5,}/ 최소한 5자리 이상 숫자 |
{n,m} | n개 이상, m개 이하 | /\d{2,5}/는 2개,3개,4개,5개 |
? | 0개 또는 1개 {0,1} | /[a-z]\d?/i 글자가 있고 그 뒤에 숫자가 없거나 한 개 있는 경우 |
* | 있거나 없어도 됨 (개수제한 없음) | /[a-z]\d*/i 글자가 있고 숫자는 있거나 없어도 됨 |
+ | 하나 이상 | /[a-z]\d+/i 글자가 있고 숫자는 한 개 이상 있는 경우 |
. | 줄바꿈을 제외한 모든 문자 | /a.p/ apple일 경우 ‘app’ |
^ | 입력값의 시작 | /^This/ This로 시작하는 경우 |
$ | 입력값의 끝 | /end?/ end로 끝나는 경우 |
9. 마침표와 이스케이프
- 마침표는 줄바꿈 문자를 제외한 모든 문자에 일치하는 특수 문자이다.
- 마침표 자체가 필요할 때는 역슬래시를 붙여 이스케이프 한다.
- 마침표 예제
- 마침표가 줄바꿈을 제외한 모든 문자에 일치한다면, 줄바꿈 문자를 포함해서 모든 문자에 일치하는 것은? [\s\S]