정규표현식 반복 찾기

Kim Jin Hyeok·2021년 2월 19일
0

반복 찾기

반복 찾기의 필요성

만약 이메일 주소와 일치하는 정규표현식이 필요할 때는 어떻게 해야할까?

이메일 주소의 기본 형식은 이런 식이다.

text@text.text

전에 배운 메타문자인 \w 로 표현 한다면

\w@\w.\w

정도로 할 수 있는데, 이렇게 하면 a@b.c 등의 주소 밖에 찾지 못한다. 문자 수가 다를 수 있기 때문에 위 패턴은 사용할 수 없다.

하나 이상의 문자 찾기

문자나 집합에 속한 요소를 하나 이상 찾으려면 뒤에 더하기(+) 문자를 붙이면 된다.

이메일의 경우엔 다음과 같다.

\w+@\w+\.\w+

만약 aaa@bbb.co.kr 같은 형식의 경우 위 패턴과 일치하지 않는데 그럴 경우는 다음처럼 사용한다.

\w+@[\w.]+\.\w+

여기서 대괄호 안 마침표(.)는 메타 문자로 사용된 것이 아니다.

문자가 없거나 하나 이상 연속하는 문자 찾기

더하기(+)는 하나 이상 연속된 문자를 찾는다. 문자가 없는 경우는 찾지 못하고, 최소 하나 이상 일치해야 한다.

하지만 있을 수도 있고 없을 수도 있는 문자를 찾을 때도 있는데 그럴땐 별표(*)를 사용한다.

문자가 없거나 하나인 문자 찾기

별표(*)와 비슿한 물음표(?) 문자가 있는데 이는 문자가 있는 경우도 일치하고 없어도 일치하지만, 별표와는 달리 문자나 집합이 없거나 하나만 있는 경우에만 일치한다. 하나 이상은 일치하지 않는다.

다음은 URL을 찾을 때의 패턴인데 다음과 같이 쓸 경우 https로 시작하는 URL은 찾지 못한다.

http:\/\/[/w.\/]+

이렇게 씀으로서 해결할 수 있다.

https?:\/\/[/w.\/]+

구간 지정하기

더하기(+), 별표(*), 물음표(?)에는 다음과 같은 문제가 있다.

  • 더하기, 별표는 일체하는 문자 수에 제한이 없다.
  • 더하기, 별표, 물음표는 일치하는 문자 수의 최소값이 0이나 1이다.

이런 문제들을 해결하고자 연속하는 문자를 찾을 때 조건을 더 구체적으로 지정할 수 있는 구간 interval 을 사용하며 이는 중괄호({})로 표시한다.

정확한 구간 찾기

문자가 일치하는 수를 정확히 정하려면, 중괄호 사이에 숫자를 넣으면 된다.

#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]

저번에 RGB값을 찾을 때 썼던 이 패턴을 아래와 같이 쉽게 쓸 수 있다.

#[0-9A-Fa-f]{6}

범위 구간 찾기

구간은 일치시키러는 수의 최솟값까지도 설정할 수 있다. {최솟값,최대값}으로 표현한다.

물음표는 {0,1}과 같다.

최소 구간 찾기

최대값 없이 최소값만 지정하려는 경우 {최솟값,}으로 표현한다.

더하기는 {1,}, 별표는 {0,}와 같다.

과하게 일치하는 상황 방지하기

더하기와 별표는 탐욕적 greedy 이므로 가장 큰 덩어리를 찾아버려 잘못된 결과를 얻을 수 있는데 이를 방지하기 위해 탐욕적 수량자를 게으른 lazy 수량자도 바꿔 문제를 해결한다. 게으른 수량자는 기존 수량자 뒤에 물음표(?)를 붙여 표현한다.

참고: Ben Forta, Learning Regular Expressions(2018)

0개의 댓글