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