Эмуляция притяжательных кванторов

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

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

Ответ 1

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

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

Ответ 2

Нет, это все. Потенциальные кванторы являются просто удобной сокращенностью для атомных групп.

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

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

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