정규 표현식(정규식)
정의
💡 문자열에서 특정 문자 조합을 찾기 위한 패턴이다.
- Javascript에서는 정규 표현식도 객체이다.
메서드
RegExp의exec()와test()메서드를 사용할 수 있다.String의match(),matchAll(),replace(),replaceAll(),search(),split()에 사용할 수 있다.
생성
정규 표현식을 만드는 두 가지 방법이 있다.
- 정규 표현식 리터럴 : 슬래시로 패턴 감싸기
/패턴/- 이 방식은 스크립트를 불러올 때 컴파일된다.
- 바뀔 일이 없는 패턴의 경우 리터럴을 사용하면 성능이 향상될 수 있다.
- RegExp 객체 : 생성자 호출
new RegExp('패턴')- 생성자 함수를 사용하면 정규 표현식이 런타임에 컴파일된다.
- 바뀔 수 있는 패턴이나, 사용자 입력 등 외부 출처에서 가져오는 패턴의 경우 이것을 사용하면 된다.
// 1. 정규 표현식 리터럴
const re1 = /ab+c/;
// 2. RegExp 객체 생성자 호출
const re2 = new RegExp('ab+c');
패턴
정규 표현식 패턴은 문자, 문자와 특수 문자 등의 조합으로 구성될 수 있다.
- : 범위(어디에서 어디까지)
a-z: a에서 z까지를 의미0-9: 0에서 9까지를 의미ㄱ-ㅎ: ㄱ에서 ㅎ까지를 의미ㅏ-ㅣ: ㅏ에서 ㅣ 까지를 의미가-힣: ‘가’에서 ‘힣’까지를 의미
[] : 괄호 안에 문자중 1개
[a-z]: a에서 z중 하나.[abc]d: ad, bd, bd를 의미
[^] : 괄호안의 문자 부정(제외)
[^a-z]: a ~ z를 제외한 모든 문자[^0-9]: 숫자를 제외한 모든 문자
^ : 문자열의 처음
^[a-zA-Z]: 영문자로 시작해야함
$ : 문자열의 끝
[a-zA-Z]$: 영문자로 끝나야함^[a-zA-Z]$: 영문자로 시작하고, 영문자로 끝나야함
| : 또는(OR)
[a-z|A-Z]: a ~ z 또는 A ~ Z 의미(영어 전체)[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]: ㄱ ~ ㅎ 또는 ㅏ ~ ㅣ 또는 가 ~ 힣 의미(한글 전체)
* : 0회 이상(여러개)
^[a-zA-Z]*$: 여러개의 문자가 모두 영문자여야 함^[0-9]*$: 여러개의 문자가 모두 숫자여야 함^[a-zA-Z0-9]*$: 여러개의 문자가 모두 영문자나 숫자여야 함
{m, n} : m회 이상, n회 이하
^[a-zA-Z]*${1, 10}: 영문자 1자 이상, 10자 이하
플래그(옵션)를 활용한 고급 탐색
- Javascript에
replace()는 있지만replaceAll()은 없다. - 이때 플래그를 활용하면 전역 탐색이나 대소문자 무시와 같은 특성을 지정할 수 있다.
- 플래그는 단독으로 사용할 수도 있고, 순서 상관 없이 한번에 여럿을 지정할 수도 있다.
gi가 가장 자주 쓰인다.
// 1. 정규 표현식 리터럴
const re1 = /pattern/flags;
// 2. RegExp 객체 생성자 호출
const re2 = new RegExp('pattern', 'flags');
g : 전역 탐색
패턴과 일치하는 모든 부분을 찾는다.
const re1 = /[1]/; const str1 = '010-1111-2222'; console.log(str1.replace(re1, 3)); // 030-1111-2222 const re2 = /[1]/g; // 또는 // const re1 = new RegExp('1', 'g'); const str2 = '010-1111-2222'; console.log(str2.replace(re2, 3)); // 030-3333-2222
i : 대소문자를 구분하지 않음
대소문자를 구분하지 않고 일치하는걸로 간주한다.
const re1 = /[a]/; const str1 = 'A'; console.log(str1.replace(re1, 'b')); // A const re2 = /[a]/i; // 또는 // const re2 = new RegExp('A', 'i'); const str2 = 'A'; console.log(str2.replace(re2, 'b')); // B