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

3

我想要进行一次搜索,搜索一个字符串(bar)是否不是立即以两个字符串(foo)或(boo)中的任何一个字符串作为前缀。

例如:

foo=bar 不应该匹配

foo=baz bar 应该匹配

bar 应该匹配

boo=bar 不应该匹配

我认为正则表达式中的look behind非常适合这种情况。但是当我尝试在MSVC++中使用(?<!来进行look behind时,会出现未处理的异常。

这个断言在问号中被支持吗?语法上有什么不同吗?或者有人能帮我写出这个正则表达式或者模拟它的行为吗?


如果可以使用look behind,你会如何编写正则表达式?我只是不确定你的定义,所以想看看你会怎么做。 - nhahtdh
2个回答

2
考虑使用Boost.Regex或Boost.Xpressive。MSVC++ 10的正则表达式实现不完整,而Boost的(Regex和Xpressive)都是完整的。两者各有优缺点。
Xpressive由于编译时正则表达式编译速度更快,并提供更好的正则表达式语法检查,但它往往会创建大量符号,因此您需要增加一些兆字节的调试信息,至少。
Regex速度快,不需要使用运算符来构建正则表达式。但是,它需要链接库。
还有其他可以执行perl正则表达式的C++正则表达式引擎,但使用Boost非常简单,无论我用什么方式测试,都没有出现任何问题。

Perl正则表达式引擎是否支持向后查找?据我所知,PHP中的PCRE不支持无限制的向后查找。 - John Dvorak
正则表达式和Xpressive都支持向后查找,但我不确定每个的限制是什么。boost-users邮件列表可能会对你有所帮助。 - moshbear

1

不多数的正则表达式支持无限制向后查找,但所有的正则表达式都支持无限制向前查找。

你可以反转字符串,使用一个向前查找,然后再反转。然而,对于大字符串来说这是很费时的。

你可以尝试使用有界的向后查找。一些正则表达式支持向后查找,如果它们知道其确切或最大长度。

你可以找到整个字符串,而不需要向后查找,然后手动丢弃一些匹配项。如果不考虑重叠,你可以将向后查找转换为可选捕获组,然后丢弃匹配到捕获组的匹配项。当替换一个正向查找时,可选捕获组不需要是可选的、捕获的(也不需要是组)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接