Эмуляция собственнических квантификаторов
Можно ли эмулировать собственнические квантификаторы (.NET не поддерживает его) с использованием атомарной группировки (или другим способом)?
Заметка. я нашел это (x+x+)++y
можно заменить на (?>(x+x+)+)y
, но это всего лишь пример, и я не знаю, всегда ли {something}@+
равно (?>{something}@)
(где @
является квантификатором).
2 ответа
Ага. Позвольте мне процитировать самого мастера, Джеффри Фридла, со страницы 142 его классического Регулярного выражения Мастеринг (3-е издание):
"В каком-то смысле притяжательные кванторы являются просто синтаксическим сахаром, поскольку их можно имитировать с помощью атомной группировки.
.++
имеет точно такой же результат, как(?>.+)
хотя умная реализация может оптимизировать собственнические квантификаторы в большей степени, чем атомарная группировка ".
Нет, это все, что нужно сделать. Притяжательные квантификаторы - это просто удобное сокращение для атомных групп.
Теперь, если вы использовали вариант, который также не поддерживает атомарные группы (такие как JavaScript и Python), вы можете использовать упреждающий просмотр, чтобы получить тот же эффект:
(?=((x+x+)+))\1y
Взгляд в будущее работает как атомная группа, за исключением того, что он не потребляет то, что ему соответствует. Таким образом, вы оборачиваете его содержимое в группу захвата, а затем используете обратную ссылку для выполнения потребления.