C++ boost::regex-\bb?

C++ boost::regex-\bb?,c++,regex,perl,boost,C++,Regex,Perl,Boost,我这里有一些使用了boost::regex::perl的注释很差的遗留代码。我以前想知道一个特定的构造,但由于代码工作(或多或少),我不愿意去碰它 现在,出于技术原因(更准确地说,Boost的当前版本不再接受该构造),我不得不触摸它,因此我必须弄清楚它的功能——或者说,它的意图是什么 正则表达式的相关部分: (?<!(\bb\s|\bb|^[a-z]\s|^[a-z])) (? 我觉得头疼的是代码> BB,我知道代码> > BB,查找文字>代码> B '/COD>这里没有意义。 \BB有

我这里有一些使用了
boost::regex::perl
的注释很差的遗留代码。我以前想知道一个特定的构造,但由于代码工作(或多或少),我不愿意去碰它

现在,出于技术原因(更准确地说,Boost的当前版本不再接受该构造),我不得不触摸它,因此我必须弄清楚它的功能——或者说,它的意图是什么

正则表达式的相关部分:

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

我觉得头疼的是代码> BB<代码>,我知道代码> > BB<代码>,查找文字>代码> B '/COD>这里没有意义。<代码> \BB<代码>有一些特殊的未记录的特性,或者我必须考虑这是一个错字吗?< /P> < P>是C++的正则表达式引擎。d其中一种兼容模式是perl兼容——如果这是一个“perl兼容”表达式,那么第二个“b”只能是一个文本

这是一个有效的表达式,对于以“b”开头的单词来说是一个非常特殊的情况

似乎是决定因素,这是一个C++库,它是给那些不是Perl、Perl兼容的正则表达式的环境。因此我的想法是Perl可以解释表达式(比如说)。是无效的。然而,为了澄清起见,它仍然值得一提,不管调整一个表示“以“b”开头的单词”的表达式有多么不可取

唯一需要注意的是,可能Boost在其自身的表达式中执行Perl,并且有人会在Perl环境中使用Boost引擎,那么所有的赌注都没有了,这是否意味着它是一个特殊的表达式。这只是一个尝试,因为语法中“!!!”在wo的开头有特殊的含义rds,你可以像这样背负既定的含义(不推荐!)

这可能是一件愚蠢的事情,但当我们处理似乎不适合其任务的代码时,有成千上万种方法会导致任务失败。

(\bb\s\bb\124;^[a-z]\s|^[a-z])
匹配a
b
(如果前面没有另一个单词字符),或者匹配任何小写字母(如果它位于字符串开头)。在任何一种情况下,字母后面都可能有空白字符。(如果设置了不区分大小写模式,它也可以匹配大写字母,如果设置了多行模式,
^
也可以匹配行首。)


但是在lookback内部,它甚至不应该编译。在某些风格中,lookback可以包含多个具有不同固定长度的备选方案,但备选方案必须位于lookback中的顶层。也就是说,
(?您不能简单地尝试
\bb
是否匹配“b”(而不是“a”)要检查它是否真的做了除单词边界之外的任何事情,后面跟着“b”?好吧,问题是——就像所有未注释的代码一样——它所做的事情实际上可能与它打算做的事情不相关。我必须根据旧的(1.34.1)测试它和当前的Boost版本,仍然需要猜测作者的意图…阅读源代码Luke(Boost::regex::perl,即..祝你好运:)如果
\bb
有特殊含义,那么你将如何指定一个单词边界,后面跟一个
b
?@mobrule:嗯…哦。非常好的一点。:-d+1指出这一点“备选方案必须在“后视”中处于最高级别”。
s/\\bb\b/(?:!!!(\\p{Alpha})|\\bb)/
(?<!\bb|^[a-z])(?<!(?:\bb|^[a-z])\s)