В QRegularExpression, какой оптимальный способ обойти утверждение lookbehind не является ограничением фиксированной длины?

Возьмите следующее регулярное выражение:

(?<=(&lt;|<)ref)

Это приведет к сбою QRegularExpression::isValid(); и QRegularExpression::errorString(); будет выведено

Утверждение lookbehind не имеет фиксированной длины

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

Возможно, для этого есть обходной путь, ориентированный на Regex? И если нет, то какова оптимальная и самая чистая стратегия для достижения этой функциональности с помощью платформы Qt?


person Anon    schedule 11.04.2018    source источник
comment
Попробуйте (?:(?<=(&lt;)|(<))ref), Qt использует PCRE.   -  person user3606329    schedule 11.04.2018
comment
@ user3606329 работает. Что здесь делает ?:?   -  person Anon    schedule 11.04.2018


Ответы (1)


Поскольку вы используете движок PCRE, длина шаблона внутри ретроспективного просмотра не является фиксированной. Альтернативы могут быть разной длины, НО не могут иметь вложенных групп чередования, даже если их длина также известна (фиксирована).

Таким образом, ваш (?<=(&lt;|<)ref) можно записать как (?<=&lt;ref|<ref). Однако более гибким решением здесь было бы использование \K: (?:&lt;|<)ref\K. Здесь группа захвата нин будет соответствовать &lt; или <, а затем после сопоставления ref весь совпадающий текст будет очищен.

person Wiktor Stribiżew    schedule 11.04.2018