Как использовать или эмулировать утверждение заглядывания в C ++?

Я ищу, чтобы выполнить поиск, где строка (бар) не предшествует сразу ни одной из двух строк (Foo) или (Boo)

например

foo=bar не должно совпадать

foo=baz bar должен соответствовать

bar должен соответствовать

boo=bar не должно совпадать

Я думаю, что взгляд на регулярное выражение был бы идеальным для этого. Однако я получаю необработанное исключение, когда пытаюсь использовать (?<! от MSVC ++ для оглядки

Поддерживается ли утверждение в? Это синтаксически отличается? Или кто-нибудь может помочь мне написать это регулярное выражение или подражать поведению?

2

Решение

Изучите использование Boost.Regex или Boost.Xpressive. Реализация регулярных выражений в MSVC ++ 10 не завершена, в то время как Boost (как для Regex, так и для Xpressive) завершен. Оба имеют свои преимущества и недостатки.

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

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

Существуют и другие движки регулярных выражений C ++, которые могут выполнять регулярные выражения Perl, но использование Boost очень безболезненно, и у меня не было никаких проблем с этим, независимо от того, что я к нему добавляю.

2

Другие решения

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

Вы можете перевернуть строку, использовать прогноз и снова повернуть вспять. Однако это дорого для больших струн.

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

Вы можете найти всю строку без просмотра, а затем отбросить некоторые совпадения вручную. Если перекрытие не является проблемой, вы можете изменить внешний вид в необязательную группу захвата, а затем отбросить совпадения, в которых группа захвата действительно совпадала. При замене положительного взгляда сзади необязательная группа захвата не должна быть ни опциональной, ни захватывающей (ни группой).

1

По вопросам рекламы [email protected]