前瞻 vs 后顾之忧

14

我很难理解“前瞻”和“后顾”的概念。例如,有一个字符串“aaaaaxbbbbb”。如果我们看" x ",那么前瞻是指向" bbbbb "还是" aaaaa ",也就是说方向的问题。


3
http://www.regular-expressions.info/lookaround.html - CaffGeek
我还是不太明白,我想用例子来说明一下。 - user1108948
1个回答

25
如果正则表达式为x(?=insert_regex_here),那么这是一个(正向)前瞻,它向前看或者说朝向“bbbb”方向。它的意思是“找到一个x,其后面跟随着insert_regex_here”。
如果正则表达式为(?<=insert_regex_here)x,那么这是一个(正向)后顾,它向后看或者说朝向“aaaa”方向。它的意思是“找到一个x,其前面跟随着insert_regex_here”。
你也可以使用负向前瞻x(?!insert_regex_here),意思是“x之后不跟随着insert_regex_here”,以及负向后顾(?<!insert_regex_here)x,意思是“x之前不跟随着insert_regex_here”。
(上述的(?=(?<!等是Perl正则表达式语法,根据你所使用的正则表达式版本略有不同)。我建议您阅读Chad在评论中提供的链接,该链接含有示例。

额,你给的那些例子是负/正回顾,而第一个例子少了一个 < :P 正/负预测不需要那个第一个 <。 (另外,所有这些尖括号的存在特别令人困惑 :P) - Steve Wang
抱歉,我是指 (?=< 而不是 (?=<。我将删除那些 <>,它们确实有点令人困惑 :P - mathematical.coffee
9
这个语法有点奇怪:名称显然告诉你引擎查找的方向。但是这个语法感觉像是信息重复:当你想要查找后面的内容时,你已经写了零宽度匹配符号 behind 所要匹配的目标。为什么引擎还需要另一个不同的运算符?(这是一个实际的问题,在注释中提出的;) - Ad N
4
问题在于正则表达式中的“向后查找”必须是固定长度的,而“向前查找”的长度可以是可变的(或者至少大多数实现都是如此)。如果你在语法上没有区分它们,就会得到错误的结果。 - Bakuriu

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