如何在C ++中使用或模拟lookbehind断言?

时间:2012-10-12 02:46:34

标签: c++ regex visual-studio-2010 lookbehind

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

例如

foo=bar不匹配

foo=baz bar应匹配

bar应匹配

boo=bar不匹配

我认为正则表达式背后的外观对此非常完美。但是当我尝试使用MSVC ++中的(?<!作为后面的看法时,我得到一个未处理的异常

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

并不是很多正则表达式支持无限制的外观,但它们都支持无限前瞻。

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

您可以使用有界的lookbehind。如果一些正则表达式确切地知道它们的确切或最大长度,它们会支持lookbehind。

您可以找到没有lookbehind的整个字符串,然后手动丢弃一些匹配项。如果不考虑重叠,您可以将lookbehind更改为可选的捕获组,然后丢弃捕获组匹配的匹配项。当替换正面的后观时,可选的捕获组不需要是可选的也不是捕获(也不是组)。