Диапазон квантификаторов не работает - PullRequest
5 голосов
/ 10 февраля 2011

Хорошо, я работаю над проектом, в котором мне нужно регулярное выражение, которое может соответствовать *, за которым следуют 1-4 пробела или табуляции, а затем строка текста. Прямо сейчас я использую. * После просмотра в целях тестирования. Однако я могу сделать так, чтобы он соответствовал явно 1, 2 или 4 пробелам / табуляциям, но не 1-4. Я тестирую против следующего блока

*    test line here
*   Second test
*  Third test
* Another test

И это два шаблона, которые я тестирую (?<=(\*[ \t]{3})).*, который работает так, как ожидалось, и соответствует 2-й строке, то же самое, если я заменяю 3 на 1, 2 или 4, однако, если я заменяю его на 1,4, формируя следующее шаблон (?<=(\*[ \t]{1,4})).* больше не соответствует ни одной из строк, и я, честно говоря, не могу понять, почему. Я пытался гуглить без успеха. Я использую флаг g (lobal).

1 Ответ

5 голосов
/ 10 февраля 2011

PHP, как и многие разновидности, не поддерживает заднюю часть переменной длины. Единственная поддержка - чередование (|) на верхнем уровне вида сзади. Даже ? может сломать шаблон. Альтернативой является использование:

(?<=\*[ \t]|\*[ \t]{2}|\*[ \t]{3}|\*[ \t]{4}).*

Или, лучше, прервать взгляд за группой:

\*[ \t]{1,4}(.*)

Это должно сработать для вас, так как не похоже, что у вас совпадают совпадения.

Из руководства:

Содержимое утверждения за кадром ограничено, так что все строки, к которым оно соответствует, должны иметь фиксированную длину. Однако, если есть несколько альтернатив, они не обязательно должны иметь одинаковую фиксированную длину. Таким образом (? <= Bullock | donkey) разрешено, но (? <! Dogs? | Cats?) Вызывает ошибку во время компиляции. Ветви, которые соответствуют строкам разной длины, разрешены только на верхнем уровне проверочного утверждения. </p>

Источник: http://www.php.net/manual/en/regexp.reference.assertions.php

...