정규 표현식(Regular Expression)은 문자열에서 찾을 패턴을 메타문자(metacharacter)로 기술하는 작은 언어다. JavaScript에서는 리터럴 /pattern/flags나 new RegExp(pattern, flags)로 만든다.
| 기호 | 의미 |
|---|---|
^ $ | 문자열의 시작·끝 |
. | 아무 문자 하나(줄바꿈 제외) |
* + ? | 0개 이상·1개 이상·0또는1개 |
[abc] [^/] | 괄호 안 문자 중 하나·괄호 안을 뺀 하나 |
\d \s | 숫자·공백 문자 |
(…) (?:…) | 캡처 그룹·비캡처 그룹 |
a|b | 둘 중 하나 |
'010-1234-5678'.replace(/(\d{3})-(\d{4})-(\d{4})/, '$1.$2.$3') // 캡처 그룹 참조
'aabbcc'.replace(/(.)\1+/g, '$1') // \1 역참조 → 'abc'
'helloWorld'.replace(/([A-Z])/g, '-$1').toLowerCase() // 'hello-world'- 플래그:
g(전체 매치),i(대소문자 무시),m(여러 줄),s(.가 줄바꿈도 매치),u(유니코드),y(sticky) - 묶기만 하고 저장할 필요가 없으면
(?:…)를 쓴다. 매치 결과에 그룹이 남지 않고$1같은 번호도 차지하지 않는다 - 문자열로 패턴을 만들 때는 백슬래시를 한 번 더 적는다:
/\d+/↔new RegExp('\\d+') - 사용자 입력을 패턴에 넣을 때는 반드시 이스케이프(escape)한다. 그러지 않으면
a.b가a-b에도 맞는다.$&는 "방금 매치된 문자열"이라 각 메타문자 앞에\를 붙이게 된다
const escapeRegExp = s => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
new RegExp(escapeRegExp('a.b')).test('a-b') // falseES2025에 표준 RegExp.escape()가 들어와 주요 브라우저와 Node.js 24+에서는 직접 만들지 않아도 된다(2026 기준).
URL(Uniform Resource Locator)에 값을 넣을 때의 이스케이프는 encodeURI와 encodeURIComponent, 문자열 처리 알고리즘은 슬라이딩 윈도우·빈도수 세기 패턴와 함께 보면 좋다.