수량자 뒤에 ?를 붙이면 가능한 적게 잡아
*?는 0번 이상 가운데 가장 적은 횟수부터 시도하고+?는 1번 이상 가운데 가장 적은 횟수부터 시도하고??는 0번을 먼저 시도하고{n,m}?는n번부터 시도해.
게으른 수량자도 나머지 패턴이 실패하면 소비량을 늘리며 백트래킹해. 탐욕적 수량자와 출발 방향이 반대일 뿐, 같은 백트래킹 엔진 위에서 움직이는 거야.
가까운 닫는 표식에서 멈추고 싶을 때 유용해
.*는 여러 <p> 블록을 마지막 </p>까지 한꺼번에 잡을 수 있어. .*?는 나머지 패턴이 처음 성공하는 닫는 표식에서 멈추므로 각 블록을 나누어 찾기 쉬워져.
게으르다고 항상 더 빠른 건 아니야
적게 잡은 뒤 늘리는 편과 많이 잡은 뒤 줄이는 편 가운데 어느 쪽이 빠른지는 입력과 나머지 패턴에 달려 있어. 그래서 게으른 수량자의 주된 선택 기준은 성능이 아니라 원하는 경계에서 멈추는지야.
경계가 한 글자라면 부정형 문자 클래스도 살펴봐
<p>([^<]*)</p>는 다음 < 전까지의 문자를 캡처해. .*?보다 경계가 분명하고 모호한 선택지도 적어. 그래도 수량화된 문자 클래스는 뒤쪽 패턴이 실패하면 문자를 돌려줄 수 있으니, 부분 표현만 보고 백트래킹이 없다고 단정하면 안 돼.