정규표현식이란?
정규 언어를 표현하기 위해 만들어진 표현. 대부분 언어의 표준 라이브러리에 존재한다.
정규표현식은 기본으로 Greedy 매칭한다. 즉, 최대한 많이 일치하는 패턴을 찾는다.
일치하는 패턴을 찾을 때 백트래킹을 이용한다. 즉 탐색하다가 매칭이 안되면 다시 뒤로 돌아가서 매칭한다. 그렇기 때문에 문자열을 찾는 하드 코딩에 비해 시간이 오래걸린다.
그러나, 길이가 길지 않은 패턴에 대해서는 유효하다. 예를 들어 아이디, 비밀번호, 이메일 등은 길이가 길지 않으므로 정규표현식을 쓰면 표현이 간단해진다.
기본 매칭
패턴이 그냥 문자열이라면, 정확히 일치하는 부분을 매칭. ( 대소문자 구분 )
메타 문자
일반 문자열과 달리, 정규표현식에서 특별한 의미를 가지는 구문들 의미한다.
온점
줄바꿈 문자 제외한 모든 단일 문자와 매칭된다. 공백도 포함한다.
패턴 | .en 임의의 하나의 단일 문자 뒤에 en 이 오는 형태 |
원문 | The penguin |
부정 문자 클래스
대괄호 안에 있는 문자들 중 하나와 매칭되는 것.
대괄호 안에 ^ 이 있는 경우, 대괄호 안에 있는 문자들을 제외한 문자와 매칭하는 것대괄호 안에 온점은 메타문자를 의미하지 않는다.문자가 많을 경우, - (하이픈 ) 을 이용해서 범위 지정 가능. ( 유효한 범위만 허용 )ex) 대문자 : [A-Z]모든 알파벳 : [A-Za-z]모든 숫자와 알파벳 : [A-z0-9]
패턴 | [^c]en c이외의 문자로 시작되고, en이 그 뒤에 따르는 형태 |
원문 | The penguin |
반복문자
패턴* : 앞에 오는 패턴이 0번 이상 반복패턴+ :앞에 오는 패턴이 1번 이상 반복패턴? : 앞에 오는 패턴이 0번 혹은 1번
패턴 | p.+n 단일문자 p 다음에 하나이상의 임의의 문자 반복. 그리고 n이 뒤따른다, |
원문 | The penguin |
정량자
패턴{ 숫자n } : 앞의 패턴이 정확히 n번 매칭
패턴{ 숫자n, } : 앞의 패턴이 n번 이상 매칭
패턴{ 숫자n, 숫자m } : 앞의 패턴이 최소 n번 최대 m번 매칭
캡쳐링 / 논-캡쳐링
캡쳐링 그룹 : 소괄호 안에 있는 패턴의 그룹. 매칭한 결과와는 별도로, 그룹을 따로 분리할 수 있다.
?: 을 붙이면 해당 괄호는 그룹 형성 안함, 논-캡쳐링 그룹
대안부호
문자열1 | 문자열2 : 문자열 1 혹은 문자열 2와 매칭
이스케이핑
예약문자들을 그대로 표시하기 위해 사용.
앵커부호
^패턴 : 패턴으로 시작하는 문자열
패턴$ : 패턴으로 끝나는 문자열
단축형 문자열
\w = [a-zA-Z0-9_]
\d = [0-9]
등 여러가지가 있따.
전방 탐색
해당 문자열보다 앞에
후방 탐색
<
긍정/부정
= : 존재하는 패턴
! : 없는 패턴
플래그
출력값을 수정할 수 있다
i : 대소문자 구분 안함
g: 전체를 대상으로 검색
m : 각 줄을 하나 하나로 인식
Lazy
정규표현식은 기본적으로 Greedy 매칭을 한다. 가장 긴 문자열을 매칭한다.
이와는 반대로 ? 를 이용해서 Lazy 매칭을 할 수 있다. 가능한 짧은 문자열을 매칭한다.
참고
https://regex101.com/
https://regexcrossword.com/unsupported.html