3

我正在寻找执行搜索,其中字符串(bar)没有立即被两个字符串(foo)或(boo)中的任何一个

例如

foo=bar不应该匹配

foo=baz bar应该匹配

bar应该匹配

boo=bar不应该匹配

我认为正则表达式背后的外观非常适合这一点。但是,当我尝试使用(?<!MSVC++ 进行查看时,我得到了一个未处理的异常

中是否支持断言?它在语法上有所不同吗?或者有人可以帮我写这个正则表达式或模仿行为吗?

4

2 回答 2

2

考虑使用 Boost.Regex 或 Boost.Xpressive。MSVC++ 10 的正则表达式实现不完整,而 Boost(对于 Regex 和 Xpressive)是完整的。两者都有其优点和缺点。

Xpressive 由于编译时正则表达式编译而速度更快,并且提供了更好的正则表达式语法检查,但它往往会创建大量符号,因此您正在查看至少几兆字节的增加调试信息。

正则表达式速度很快,并且不需要表达性地使用运算符来构建正则表达式。但是,它确实需要在库中进行链接。

存在其他可以执行 perl 正则表达式的 C++ 正则表达式引擎,但是使用 Boost 非常轻松,而且我没有遇到任何问题,无论我扔什么。

于 2012-10-12T03:08:21.577 回答
1

没有多少正则表达式支持无限后瞻,但它们都支持无限前瞻。

您可以反转字符串,使用前瞻并再次反转。然而,这对于大字符串来说是昂贵的。

您也许可以使用有界的lookbehind。如果某些正则表达式知道其确切长度或最大长度,则它们支持向后查找。

您可能会在没有后视的情况下找到整个字符串,然后手动丢弃一些匹配项。如果重叠不是问题,您可以将后视更改为可选的捕获组,然后丢弃捕获组匹配的匹配项。当替换一个肯定的lookbehind 时,可选的捕获组不需要是可选的,也不需要捕获(也不是组)。

于 2012-10-12T03:14:44.260 回答