정규식(PCRE) PCRE Patterns Repetition

반복은 다음 항목 중 하나를 따를 수 있는 수량자로 지정됩니다.

  • a single character, possibly escaped
  • the . metacharacter
  • a character class
  • a back reference (see next section)
  • a parenthesized subpattern (unless it is an assertion - see below)

일반 반복 수량자는 쉼표로 구분된 중괄호(중괄호)에 두 숫자를 제공하여 허용되는 일치의 최소 및 최대 수를 지정합니다. 숫자는 65536보다 작아야 하고 첫 번째는 두 번째보다 작거나 같아야 합니다. 예: z{2,4}는 "zz", "zzz" 또는 "zzzz"와 일치합니다. 닫는 중괄호 자체는 특수 문자가 아닙니다. 두 번째 숫자가 생략되었지만 쉼표가 있는 경우 상한선이 없습니다. 두 번째 숫자와 쉼표가 모두 생략된 경우 수량자는 필요한 일치 항목의 정확한 수를 지정합니다. 따라서 [aeiou]{3,}는 연속된 3개 이상의 모음과 일치하지만 더 많이 일치할 수 있는 반면 \d{8}는 정확히 8자리와 일치합니다. 수량자가 허용되지 않거나 수량자의 구문과 일치하지 않는 위치에 나타나는 여는 중괄호는 리터럴 문자로 간주됩니다. 예를 들어, {,6}은 수량자가 아니라 4자의 리터럴 문자열입니다.

수량자 {0}이(가) 허용되어 표현식이 이전 항목과 수량자가 없는 것처럼 작동합니다.

편의(및 과거 호환성)를 위해 가장 일반적인 세 ​​가지 수량자에는 단일 문자 약어가 있습니다.

단일 문자 수량자

* equivalent to {0,}
+ equivalent to {1,}
? equivalent to {0,1}

상한이 없는 수량자와 일치하는 문자가 없는 하위 패턴을 따라 무한 루프를 구성할 수 있습니다. 예: (a?)*

이전 버전의 Perl 및 PCRE에서는 이러한 패턴에 대해 컴파일 시간에 오류가 발생했습니다. 그러나 이것이 유용할 수 있는 경우가 있기 때문에 이러한 패턴은 이제 허용되지만 하위 패턴의 반복이 실제로 일치하는 문자가 없으면 루프가 강제로 중단됩니다.

기본적으로 수량자는 "reedy"입니다. 즉, 나머지 패턴이 실패하지 않고 가능한 한 많이 일치합니다(최대 허용 횟수까지). 이것이 문제를 일으키는 전형적인 예는 C 프로그램에서 주석을 일치시키려는 것입니다. 이들은 시퀀스 /*와 */ 사이에 나타나며 시퀀스 내에서 개별 * 및 / 문자가 나타날 수 있습니다. /\*.*\*/ 패턴을 /* first comment */ not comment /* second comment */ 문자열에 적용하여 C 주석을 일치시키려는 시도는 . * 안건.

그러나 수량자 뒤에 물음표가 오면 지연되고 대신 가능한 최소 횟수와 일치하므로 /\*.*?\*/ 패턴은 C 주석과 함께 올바른 작업을 수행합니다. 다양한 수량자의 의미는 달리 변경되지 않고 선호되는 일치 수만 변경됩니다. 물음표의 사용과 그 자체로 수량자로서의 사용을 혼동하지 마십시오. 두 가지 용도가 있기 때문에 \d??\d 에서처럼 두 배로 나타날 수 있습니다. \d??\d는 기본 설정에 따라 한 자리 숫자와 일치하지만 나머지 패턴이 일치하는 유일한 방법인 경우 두 자리도 일치할 수 있습니다.

PCRE_UNGREEDY 옵션이 설정되어 있으면(Perl에서 사용할 수 없는 옵션) 수량자는 기본적으로 greedy가 아니지만 물음표를 뒤에 따라 개별적으로 greedy를 만들 수 있습니다. 즉, 기본 동작을 반전시킵니다.

+ 뒤에 오는 수량자는 "possessive"입니다. 그들은 가능한 한 많은 캐릭터를 먹고 나머지 패턴과 일치하기 위해 돌아오지 않습니다. 따라서 .*abc는 "aabc"와 일치하지만 .*+abc는 전체 문자열을 .*+먹기 때문에 일치하지 않습니다. 소유 수량자를 사용하여 처리 속도를 높일 수 있습니다.

괄호 안의 서브패턴이 1보다 크거나 제한된 최대 반복 횟수로 정량화되면 최소 또는 최대 크기에 비례하여 컴파일된 패턴에 더 많은 저장이 필요합니다.

패턴이 .* 또는 .{0,}로 시작하고 PCRE_DOTALL 옵션(Perl의 /s와 동일)이 설정되면 . 개행과 일치하기 위해 패턴은 암시적으로 고정됩니다. 그 이유는 다음에 오는 것이 주제 문자열의 모든 문자 위치에 대해 시도될 것이기 때문에 첫 번째 위치 이후의 어떤 위치에서든 전체 일치를 재시도하는 것은 의미가 없기 때문입니다. PCRE는 이러한 패턴을 \A가 앞에 오는 것처럼 처리합니다. 주제 문자열에 줄 바꿈이 없는 것으로 알려진 경우 이 최적화를 얻기 위해 패턴이 .*로 시작할 때 PCRE_DOTALL을 설정하거나 ^를 사용하여 명시적으로 앵커링을 표시하는 것이 좋습니다.

캡처하는 하위 패턴이 반복될 때 캡처된 값은 최종 반복과 일치하는 하위 문자열입니다. 예를 들어, (tweedle[dume]{3}\s*)+가 "tweedledum tweedledee"와 일치한 후 캡처된 하위 문자열의 값은 "tweedledee"입니다. 그러나 중첩된 캡처 하위 패턴이 있는 경우 해당 캡처된 값이 이전 반복에서 설정되었을 수 있습니다. 예를 들어 /(a|(b))+/가 "aba"와 일치한 후 두 번째로 캡처된 하위 문자열의 값은 "b"입니다.