Эмуляция собственнических квантификаторов - PullRequest
15 голосов
/ 04 апреля 2011

Можно ли эмулировать собственнические квантификаторы (.NET не поддерживает его), используя атомарную группировку (или другим способом)?

Примечание. Я обнаружил, что (x+x+)++y можно заменить на (?>(x+x+)+)y, но это всего лишь пример, и я не знаю, всегда ли {something}@+ равно (?>{something}@) (где @ - квантификатор).

Ответы [ 2 ]

23 голосов
/ 05 апреля 2011

Да.Позвольте мне процитировать самого мастера, Джеффри Фридла, со страницы 142 его классических Мастеринг регулярных выражений (3-е издание) :

"В каком-то смысле квантификаторы притяжений являются просто синтаксическим сахаром, поскольку их можно имитировать с помощью атомарной группировки. Что-то вроде .++ имеет точно такой же результат, что и (?>.+), хотя умная реализация может оптимизировать собственнические квантификаторы больше, чем атомная группировка. "

6 голосов
/ 05 апреля 2011

Нет, это все, что нужно сделать.Притяжательные квантификаторы - это просто удобное сокращение для атомных групп.

Теперь, если вы использовали ароматизатор, который также не поддерживает атомарные группы (такие как JavaScript и Python), вы могли бы использовать упреждающий просмотр, чтобы получить тот же эффект:

(?=((x+x+)+))\1y

Alookahead работает так же, как атомная группа, за исключением того, что она не потребляет то, что ей соответствует.Таким образом, вы упаковываете его содержимое в группу захвата, а затем используете обратную ссылку для выполнения потребления.

...