정규 표현식
일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언어(formal language)
const tel = '010-1234-567팔'
const regExp = /^\d{3}-\d{4}\d{4}$/;
regExp.test(tel); // false
패턴과 플래그로 구성
/regexp(패턴)/i(플래그)
패턴 : 정규 표현식의 패턴
플래그 : 정규 표현식의 플래그 (g, i, m, u, y)
const target = 'Is this all there is?';
const regexp = /is/i;
regexp.test(target); // true
RegExp
생성자 함수를 이용해 변수를 사용해 동적으로 RegExp
객체 생성const count = (str, char) => (str.match(new RegExp(char, 'gi')) ?? []).length;
count('Is this all there is?', 'is'); // 3
count('Is this all there is?', 'xx'); // 0
exec
메서드
인수로 전달받은 문자열에 대해 정규 표현식의 패턴을 검색하여 매칭 결과를 배열로 반환
매칭 결과가 없는 경우 null
반환
문자열 내의 모든 패턴을 검색하는 g 플래그를 지정해도 첫 번째 매칭 결과만 반환
const target = 'Is this all there is?';
const regExp = /is/;
regExp.exec(target);
// ['is', index: 5, input: 'Is this all there is?', groups: undefined]
test
메서드
인수로 전달받은 문자열에 대해 정규 표현식의 패턴을 검색하여 매칭 결과를 불리언 값으로 반환
const target = 'Is this all there is?';
const regExp = /is/;
regExp.test(target); // true
match
메서드
대상 문자열과 인수로 전달받은 정규 표현식과의 매칭 결과를 배열로 반환
const target = 'Is this all there is?';
const regExp = /is/;
target.match(regExp);
// ['is', index: 5, input: 'Is this all there is?', groups: undefined]
const target = 'Is this all there is?';
const regExp = /is/g;
target.match(regExp);
// ['is', 'is']
플래그는 정규 표현식의 검색 방식을 설정하기 위해 사용
중요 플래그
플래그 | 의미 | 설명 |
---|---|---|
i | Ignore case | 대소문자를 구별하지 않고 패턴을 검색한다. |
g | Global | 대상 문자열 내에서 패턴과 일치하는 모든 문자열을 전역 검색한다. |
m | Multi line | 문자열의 행이 바뀌더라도 패턴 검색을 계속한다. |
플래그는 옵션이므로 선택적으로 사용
순서와 상관없이 하나 이상의 플래그를 동시에 설정할 수 있음
어떠한 플래그를 사용하지 않은 경우 대소문자를 구별해서 패턴 검색
문자열에 패턴 검색 매칭 대상이 1개 이상 존재해도 첫 번째 대상만 검색하고 종료
/
로 열고 닫으며 문자열의 따옴표는 생략const target = 'Is this all there is?';
const regExp = /is/;
regExp.test(target); // true
target.match(regExp); // ['is', index: 5, input: 'Is this all there is?', groups: undefined]
i
사용const target = 'Is this all there is?';
const regExp = /is/i;
target.match(regExp); // ['Is', index: 0, input: 'Is this all there is?', groups: undefined]
g
사용const target = 'Is this all there is?';
const regExp = /is/ig;
target.match(regExp); // ['Is', 'is', 'is']
.
은 임의의 문자 한 개를 의미 (문자 내용은 무엇이든 상관 X)const target = 'Is this all there is?';
const regExp = /.../g;
target.match(regExp); // ['Is ', 'thi', 's a', 'll ', 'the', 're ', 'is?']
{m,n}
은 앞선 패턴이 최소 m번, 최대 n번 반복되는 문자열 의미
콤마 뒤에 공백이 있으면 정상 동작 X
const target = 'A AA B BB Aa Bb AAA';
const regExp = /A{1,2}/g;
target.match(regExp); // ['A', 'AA', 'A', 'AA', 'A']
const target = 'A AA B BB Aa Bb AAA';
const regExp = /A{2}/g;
target.match(regExp); // ['AA', 'AA']
const target = 'A AA B BB Aa Bb AAA';
const regExp = /A{2,}/g;
target.match(regExp); // ['AA', 'AAA']
+
은 앞선 패턴이 한 번 반복되는 문자열 의미+
== 1const target = 'A AA B BB Aa Bb AAA';
const regExp = /A+/g;
target.match(regExp); // ['A', 'AA', 'A', 'AAA']
?
은 앞선 패턴이 최대 한 번(0번 포함) 이상 반복되는 문자열 의미?
== {0, 1}const target = 'color colour';
const regExp = /colou?r/g;
target.match(regExp); // ['color', 'colour']
|
은 or의 의미const target = 'A AA B BB Aa Bb AAA';
const regExp = /A|B/g;
target.match(regExp); // ['A', 'A', 'A', 'B', 'B', 'B', 'A', 'B', 'A', 'A', 'A']
+
를 함께 사용[...]
내의 ^
은 not의 의미
[^0-9]
는 숫자를 제외한 문자를 의미
const target = 'AA BB 12 Aa Bb';
const regExp = /[^0-9]+/g;
target.match(regExp); // ['AA BB ', ' Aa Bb']
[...]
밖의 ^
은 문자열의 시작 의미
[...]
내의 ^
은 not의 의미
const target = 'https://poiemaweb.com';
const regExp = /^https/;
regExp.test(target); // true
$
은 문자열의 마지막 의미const target = 'https://poiemaweb.com';
const regExp = /com$/;
regExp.test(target); // true
^
는 문자열의 시작을 의미
?
는 앞선 패턴이 최대 한 번(0번 포함)이상 반복되는지를 의미
const url = 'https://example.com'
/^https?:\/\//.test(url); // true
/^(http|https):\/\//.test(url); // true
$
는 문자열의 마지막을 의미const fileName = 'index.html'
/html$/.test(fileName); // true
^
는 문자열의 시작을 의미$
는 문자열의 마지막을 의미\d
는 숫자를 의미+
는 앞선 패턴이 최소 한 번 이상 반복되는 문자열 의미const target = '12345'
/^\d+$/.test(target); // true
\s
는 여러 가지 공백문자를 의미
\s
는 [\t\r\n\v\f]
와 같은 의미
const target = ' Hi!'
/^[\s]+/.test(target); // true
const id = 'abc123'
/^[A-Za-z0-9]{4,10}$/.test(id); // true
const email = 'ungmo2@gmail.com'
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/.test(email); // true
const tel = '010-1234-5678'
/^\d{3}-\d{3,4}\d{4}$/.test(tel); // true
const target = 'abc#123';
(/[^A-Za-z0-9]/gi).test(target); // true
String.prototype.replace
메서드 사용target.replace(/[^A-Za-z0-9]/gi, ''); // abc123