정규 표현식(정규식)
정의
💡 문자열에서 특정 문자 조합을 찾기 위한 패턴이다.
- 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