1. [정규표현식 메타문자] 수량자 (Quantifier) 이란?
※ (수량자는, 1 이상의 문자들의 반복 범위를 지정할 때 쓰여짐)
- 기본적으로 수량자는,
. 별도 제한 설정을 하지 않으면, 항상 무한대의 수량을 검사하게 됨
. 이를두고, 욕심 많은(Greedy) 수량자 라고도 함
. 그 반대는, 욕심 없는(Non-Greedy) 수량자라고 함
2. 수량자 (quantifier) (반복) : *, +, ?, { }
ㅇ ? : (0 또는 1회 만 매치)
- 직전 문자가 없거나(0), 일회(1) 만 일치함
. 例) https? => http 또는 https 둘 중 어느 것도 일치
. 例) (? => 여는 괄호가 있어도 되고 없어도 됨
. 例) [ -]? => 공백문자( ) 또는 하이픈(-) 또는 문자 없어도 됨
- 기본적으로 ? 는, 욕심을 제한하는 수량자 임 (욕심 없는, Non-Greedy)
. *? : (최소 0개 즉, 최소 매치)
. +? : (최소 1개 즉, 1회 만 매치)
. ?? : (최소 0개)
ㅇ * : (최소 0회 이상 반복 매치)
- 직전 문자가 0회 이상 반복 일치함 (없거나 1회 이상)
. 例) 123a* => 123, 123a, 123aa, 123aaa, ... 등
. 例) a* => a,aa,aaa 등과는 일치하나, aba와는 불일치
. 例) k.*d => k tword, k tword, ktword, ktword d 등
.. (여기서, .* 은 임의 문자가 0회 이상 반복될 때 매치됨)
- 탐욕적(Greedy) 수량자 임
ㅇ + : (최소 1회 이상 반복 매치) => 탐욕적(Greedy) 수량자 임
- 직전 문자가 1회 이상 일치함 (최소 1회 이상)
. 例) \d+ => 하나 이상 연속된 숫자
- 탐욕적(Greedy) 수량자 임 ☞ 아래 3.항 참조
※ 특히, 위 *, + 는, 메타문자 . (즉, .*, .+) 와 조합시켜 사용할 때가 많음
ㅇ {n} : (n회 반복)
- 정확히 n번 반복
. 例) x{2} => xx
ㅇ {n,} : (n번 이상 반복)
- 적어도 n회 이상 반복 매치
. 例) `x*` 및 `x{0,}` => 이 둘이 동일함
. 例) `x+` 및 `x{1,}` => 이 둘이 동일함
. 例) `x?` 및 `x{0,1}` => 이 둘이 동일함
- 탐욕적(Greedy) 수량자 임
ㅇ {n,m} : (범위 지정 반복, n회부터 m회까지 반복)
- 최소 n번부터 최대 m번까지 반복
. 例) x{1,4} => x|xx|xxx|xxxx 과 동일한 표현식
3. 탐욕적(Greedy) 수량자 : *, +, {n,}
ㅇ 이 세 수량자는,
- 텍스트의 앞부터 탐색하는 것이 아니라,
- 텍스트의 마지막부터 한꺼번에 전부 찾으므로, 과도하게 일치됨
ㅇ 따라서, 이를 다음과 같이 게으른(Lazy,욕심 없는) 수량자로 바꾸면 좋음
- * → *?
- + → +?
- {n,} → {n,}?