Эмуляция собственнических квантификаторов

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам