boost::regex - \bb?

5
我这里有一些注释不太好的遗留代码,其中使用了boost::regex::perl。我之前对其中一个特定结构有所疑惑,但由于代码(多少)能够正常工作,因此我不愿意去碰它。
现在出于技术原因(更准确地说,当前版本的Boost不再接受该结构),我必须去修改它,因此我需要弄清楚它是用来做什么的 - 或者更确切地说,它的目的是什么。
正则表达式的相关部分:
(?<!(\bb\s|\bb|^[a-z]\s|^[a-z]))

让我头疼的部分是\bb。我知道\b,但我找不到关于\bb的提及,并且在寻找字面上的'b'在这里没有意义。 \bb是一种特殊的未记录功能,还是我必须将其视为拼写错误?


2
你能否尝试一下,看看\bb是否与"b"(而不是"a")匹配,以检查它是否除了单词边界后跟着"b"之外还有其他作用吗? - Jens
问题在于,像所有没有注释的代码一样,它所做的可能实际上并不符合它的意图。我需要将其与旧版本(1.34.1)和当前的 Boost 版本进行测试,并且仍然需要猜测作者的意图...... - DevSolar
阅读源代码,卢克(关于boost :: regex :: perl..祝你好运:) - Øyvind Skaar
7
如果\bb有特殊意义,那么你该如何指定一个后面跟着字母b的词边界? - mob
@mobrule:嗯...噢。非常好的观点。:-D - DevSolar
@mobrule:把它变成一个答案,你会因其纯粹简单的美而获得“正确”的标签。;-) - DevSolar
2个回答

4
作为C++的正则表达式引擎,Boost似乎是一个perl兼容模式。如果这是一个“perl-compatible”表达式,那么第二个'b'只能是一个字面量。
这是一个有效的表达式,对于以'b'开头的单词来说是一个特殊情况。
这似乎是决定这是一个C++库的关键因素,并且它是为了给不是perl的环境提供perl兼容的正则表达式。因此,我的最初想法是perl可能会解释该表达式(例如使用overload::constant),这是无效的。然而,仍然值得提一下,只是为了澄清目的,无论如何修改一个意思为“以'b'开头的单词”的表达式都是不可取的。
唯一的注意事项是,也许 Boost 在其自身的表达式方面表现优于 Perl,并且有人会在 Perl 环境中使用 Boost 引擎,那么是否可以将其视为特殊表达式就不确定了。这只是一个尝试,在一个语法中,“!!!” 在单词开头表示某种特殊含义,你可以像这样利用已经建立的含义(不推荐!)。
s/\\bb\b/(?:!!!(\\p{Alpha})|\\bb)/

这样做是很愚蠢的,但由于我们处理的代码似乎不适合其任务,所以有成千上万种失败任务的方法。


3

(\bb\s|\bb|^[a-z]\s|^[a-z])匹配一个b,如果它不是由另一个单词字符或任何小写字母在字符串开头之前。在这两种情况下,字母后面可以跟随一个空格字符。(如果设置了大小写不敏感模式,则还可以匹配大写字母,并且如果设置了多行模式,则^也可以匹配行的开头。)

但在回顾中,甚至不应该编译。在某些版本中,回顾可能包含具有不同固定长度的多个替代项,但是替代必须位于回顾的顶层。也就是说,(?<=abc|xy|12345)将起作用,但是(?<=(abc|xy|12345))不会。因此,即使在那些版本中,您的正则表达式也无法工作,但Boost的文档仅表示回顾表达式必须具有固定长度。

如果您真的需要考虑该正则表达式匹配的所有四个可能性,我建议您将回顾分为两个部分:

(?<!\bb|^[a-z])(?<!(?:\bb|^[a-z])\s)

+1 是指出“交替必须在后顾之中的顶层。” - DevSolar

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