정규표현식(정규식)이란
- 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어
- 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있음
패턴이란?
- 일치하는 텍스트가 준수해야 하는 **“패턴”**을 표현하기 위해 특정한 표준의 텍스트 신택스(syntax)를 의미하기 위해 사용된다.
- 정규 표현식의 각 문자(즉, 패턴을 기술하는 문자열 안의 각 문자)는 메타 문자(특별한 의미)로 이해되거나 정규 문자(문자 그대로, 즉 ‘리터럴’의 의미로)로 이해된다.
Java Script 정규표현식 활용
정규표현식 만들기
-
정규 표현식 리터럴 : 다음과 같이 슬래시로 패턴을 감싸서 작성
- 스크립트를 불러올 때 컴파일되므로, 바뀔 일이 없는 패턴의 경우 리터럴을 사용하면 성능이 향상될 수 있다.
const re = /ab+c/; -
RegExp 객체의 생성자 호출 : 생성자 함수를 사용하면 정규 표현식이 런타임에 컴파일됨
- 바뀔 수 있는 패턴이나, 사용자 입력 등 외부 출처에서 가져오는 패턴의 경우 사용
const re = new RegExp("ab+c");
정규표현식 구조
- 데이터의 시작점(
^) - … (정규표현식 특수문자 구분 참고)
- 데이터의 끝점(
$)
정규표현식 패턴
- 단순 패턴 사용하기
- 문자열을 있는 그대로 탐색할 때 사용
- ex) /abc/ 패턴
- “Grab crab” 문자열의 경우 부분 문자열로 “ab c”를 포함하긴 하지만, 정확하게 “abc”를 포함하진 않기 때문
"Hi, do you know your **abc**'s?"; // 일치 성공 "The latest airplane designs evolved from sl**abc**raft."; // 일치 성공 "Gr**ab c**rab"; // 일치 실패
- 특수 문자 사용하기
- 직접적인 일치 이상의 탐색이 필요할 땐 특수 문자를 사용
- 하나 이상의 “b”를 찾거나, 공백 문자를 찾는 등
- ex) /ab*c/ 패턴
- 하나의 “a” 이후에 0개 이상의 “b”, 그 뒤의 “c” 일치해야 함
- “b” 뒤의 “*”는 “이전 항목의 0번 이상 반복”을 의미
"cbbabbbbcdebc"; // 일치하는 부분 문자열 : "abbbbc"
- 직접적인 일치 이상의 탐색이 필요할 땐 특수 문자를 사용
정규표현식 특수문자 구분
- 문자 클래스
- . : 1개의 문자와 일치한다.
- : “[”와 “]” 사이의 문자 중 하나를 선택한다. “|”를 여러개 쓴 것과 같은 의미이다.
- 어서션
- 그룹과 범위
- x|y : x 또는 y가 매칭됨
- /green|red
"green apple"; // "green"과 매칭 "red apple"; // "red"와 매칭
- /green|red
- [xyz], [a-c] : 포함된 문자 중 하나와 일치, 하이픈을 사용하여 문자 범위를 지정할 수 있음, 하이픈이 첫번째 혹은 마지막 문자로 나타나면 리터럴 문자로 간주됨
- [abcd] === [a-d]
"brisket"; // "b"와 매칭 "chop"; // "c"와 매칭 - [abcd-] === [-abcd]
"brisket"; // "b"와 매칭 "chop"; // "c"와 매칭 "non-profit"; // a,b,c,d 중 아무것도 매칭되는 것이 없지만, "-"와 매칭이 됨
- [abcd] === [a-d]
- [^xyz], [^a-c] : 문자 클래스 안의 문자를 제외한 나머지를 선택한다
- (x) : 캡처링 그룹, x를 매치, 단순 묶는 용도인듯
- x|y : x 또는 y가 매칭됨
- 수량자
- ? : 0번 또는 1차례까지의 발생을 의미
- /colou?r/
"color"; // 일치 "colour"; // 일치 "colouur"; // 불일치
- /colou?r/
-
- : 0번 이상의 발생을 의미
- /ab*c/
"ac"; // 일치 "abc"; // 일치 "abbc"; // 일치 "abbbc"; // 일치
- /ab*c/
- : 0번 이상의 발생을 의미
-
- : 1번 이상의 발생을 의미
- /ab+c/
"ac"; // 불일치 "abc"; // 일치 "abbc"; // 일치 "abbbc"; // 일치
- /ab+c/
- : 1번 이상의 발생을 의미
- {n} : 정확히 n번 만큼 일치
- {min,} : 적어도 min번만큼 일치
- {min,max} : 적어도 min번만큼 일치시키지만 max번을 초과하여 일치시키지는 않음
- ? : 0번 또는 1차례까지의 발생을 의미
- 유니코드 속성 이스케이프
정규표현식 메서드
- exec() : 문자열에서 일치하는 부분을 탐색, 일치 정보를 나타내는 배열(일치가 없는 경우에는 null) 반환
- test() : 문자열에 일치하는 부분이 있는지 확인(true or false 반환)
- match() : 캡처 그룹을 포함해서 모든 일치를 담은 배열을 반환(일치가 없으면 null) 반환
- matchAll() : 캡처 그룹을 포함해서 모든 일치를 담은 반복기를 반환
- search() : 문자열에서 일치하는 부분을 탐색, 일치하는 부분의 인덱스(일치가 없는 경우 -1) 반환
- replace() : 문자열에서 일치하는 부분을 탐색, 대체 문자열로 변경
- replaceAll() : 문자열에서 일치하는 부분을 모두 탐색하고, 모두 대체 문자열로 변경
- split() : 정규 표현식 또는 문자열 리터럴을 사용해서 문자열을 부분 문자열의 배열로 나눔
정규표현식 플래그
- d : 부분 문자열 일치에 대해 인덱스 생성
- g : 전역 탐색
- i : 대소문자를 구분하지 않음
- m : 여러 줄에 걸쳐 탐색
- s : 개행문자가 ‘.’과 일치함
- u : “unicode”, 패턴을 유니코드 코드 포인트의 시퀀스로 간주
- y : “접착” 탐색, 대상 문자열의 현재 위치에서 탐색을 시작함
- 플래그 사용
const re = /pattern/flags; - 생성자 사용
const re = new RegExp("pattern", "flags");
플래그는 정규식과 완전히 합쳐지므로 나중에 추가하거나 제거할 수 없다.
정규표현식의 실제 활용
- 검색 엔진
- 워드 프로세스와 문서 편집기의 찾아 바꾸기 대화상자
- sed/AWK와 같은 문자 처리 유틸리티
- 어휘 분석