정규 표현식, Regular Expression
문자열에서 특정 문자 조합을 찾기 위한 패턴
자바스크립트에서는 정규 표현식도 객체
정규 표현식 작성 방법
정규 표현식 리터럴
– 슬래시('/')로 패턴을 감싸서 작성
– 스크립트를 불러 올 때 컴파일 되므로, 바뀔 일이 없는 패턴의 경우에 사용
const re = /ab+c/
RegExp 객체의 생성자 호출
– 생성자 함수를 사용하면 정규 표현식이 런타임에 컴파일 됨
– 바뀔 수 있는 패턴이나 사용자 입력과 같이 외부 출처에서 가져오는 패턴의 경우에 사용
const re = new RegExp('ab+c')
정규 표현식 패턴
단순 패턴
문자열을 있는 그대로 탐색할 때 사용
예를 들어, /abc/ 패턴은 문자열에서 정확한 순서로 "abc" 라는 문자의 조합이 나타나는 부분과 일치
특수 문자
직접적인 일치 이상의 탐색이 필요할 때 사용
예를 들어, /ab*c/ 패턴에서 b*는 b의 0번 이상 반복을 의미
이 패턴을 문자열 "cbbabbbbcdebc"에 대해 사용하면, 일치하는 부분 문자열은 "abbbbc"
어서션
– 줄이나 단어의 시작과 끝을 나타내는 경계
– 일치가 가능한 방법을 나타내는 패턴(전방탐색, 후방탐색, 조건 표현식 등) 포함
문자 클래스
– 글자와 숫자처럼 다른 유형의 문자를 구분
그룹과 범위
– 표현 문자의 그룹과 범위를 나타냄
수량자
– 일치할 문자나 표현이 반복되어야 할 횟수를 나타냄
유니코드 속성 이스케이프
– 대/소문자, 수학 기호, 문장 부호처럼, 유니코드 문자 속성에 따라 문자를 구분
이스케이핑
특수문자를 있는 그대로 탐색해야 하는 경우, 특수 문자 앞에 역슬래시('\')를 배치
예를 들어, "a*b"와 일치해야 하면 /a\*b/ 를 사용
역슬래시가 별표('*')를 이스케이프해서, 특수 문자가 아닌 문자 리터럴로 취급
– 슬래시(/)와 일치해야 하는 경우에도 이스케이프
– 리터럴 역슬래시(\)에 일치하려면 역슬래시를 이스케이프
RegExp 생성자와 문자열 리터럴을 사용하는 경우
– 역슬래시가 문자열 리터럴의 이스케이프로도 작동
– /a\*b/ 패턴을 생성하려면 new RegExp("a\\*b")가 되어야 함
괄호 사용
괄호로 감싼 부분과 일치하는 부분 문자열을 기억하고 나중에 다시 사용 가능
자바스크립트에서 정규 표현식 사용
정규 표현식은 RegExp의 메서드 test()와 exec(), String의 메서드 match(), replace(), search(), split()에서 사용 가능
메서드 | 설명 |
exec() | 문자열에서 일치하는 부분을 탐색합니다. 일치 정보를 나타내는 배열, 또는 일치가 없는 경우 null을 반환 |
test() | 문자열에 일치하는 부분이 있는지 확인하고, true 또는 false를 반환 |
match() | 캡처 그룹을 포함해서 모든 일치를 담은 배열을 반환하고, 일치가 없으면 null을 반환 |
matchAll() (en-US) |
캡처 그룹을 포함해서 모든 일치를 담은 반복기를 반환 |
search() | 문자열에서 일치하는 부분을 탐색하여 일치하는 부분의 인덱스를 반환하거나, 일치가 없는 경우 -1을 반환 |
replace() | 문자열에서 일치하는 부분을 탐색하고, 그 부분을 대체 문자열로 바꿈 |
replaceAll() (en-US) |
문자열에서 일치하는 부분을 모두 탐색하고, 모두 대체 문자열로 바꿈 |
split() | 정규 표현식 또는 문자열 리터럴을 사용해서 문자열을 부분 문자열의 배열로 나눔 |
exec() 메서드를 사용 예제
const myRe = /d(b+)d/g;
const myArray = myRe.exec('cdbbdbsbz');
정규 표현식 객체의 속성에 접근할 필요가 없으면 아래와 같이 짧게 작성
const myArray = /d(b+)d/g.exec('cdbbdbsbz');
정규 표현식을 문자열에서 만들고 싶으면 아래처럼 사용
const myRe = new RegExp('d(b+)d', 'g');
const myArray = myRe.exec('cdbbdbsbz');
플래그를 활용한 고급 탐색
정규 표현식은 전역 탐색이나 대소문자 무시와 같은 특성을 지정하는 플래그를 가질 수 있음
– 플래그는 단독으로 사용할 수도 있고, 순서에 상관 없이 한꺼번에 지정 가능
– 플래그는 정규식과 완전히 합쳐지므로 나중에 추가하거나 제거할 수 없음
플래그 | 설명 |
d | 부분 문자열 일치에 대해 인덱스 생성 |
g | 전역 탐색 |
i | 대소문자를 구분하지 않음 |
m | 여러 줄에 걸쳐 탐색 |
s | 개행 문자가 .과 일치 |
u | "unicode", 패턴을 유니코드 코드 포인트의 시퀀스로 간주 |
y | 접착 탐색, 대상 문자열의 현재 위치에서 탐색을 시작 |
플래그를 사용한 정규 표현식
const re = /pattern/flags;
생성자를 사용한 경우
const re = new RegExp('pattern', 'flags');
↓ 참고 사이트
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
'Study > JavaScript' 카테고리의 다른 글
[JavaScript] 문자열을 객체의 key로 하여 value에 접근하는 방법 (0) | 2023.04.21 |
---|---|
[JavaScript] Array.fill 과 Array.from 차이? (0) | 2022.08.30 |
[JavaScript] 논리 연산자로 변수에 값 할당하기 (0) | 2021.10.22 |
[JavaScript] 중급 #18 - Generator (0) | 2021.10.19 |
[JavaScript] 중급 #17 - async, await (0) | 2021.10.19 |