regex - 负向后查找在可选 token 之前失败

标签 regex pcre lookbehind

(?<!a)b?c

针对 abc,此正则表达式与 c 匹配。我错过了什么吗?

最佳答案

是的,这是正确的。以下是从引擎角度对比赛的快速浏览。

  • 尝试从 a 之前的位置开始匹配。失败。字符串前进。
  • 尝试从 a 之前的位置开始匹配。失败。字符串前进。
  • 当前位置:c 之前
  • 是否可以进行负向回顾 (?<!a)断言前面的不是 a检查。(这是 b )
  • 可以b?匹配零或一 b检查。我们匹配零 b
  • 可以c匹配c检查。
  • 还有更多标记可以匹配吗?没有。我们有一场比赛。

向后看

在.NET中,它具有无限的lookbehind,你可以使用这个:

(?<!a.*)b?c

但是 PCRE 没有无限的向后查找。您可以使用它来代替:

^[^a]*\Kb?c

它是如何工作的:

  • ^ anchor 断言我们位于字符串的开头
  • [^a]*匹配任何非 a 字符
  • \K告诉引擎从它返回的最终匹配中删除到目前为止匹配的内容
  • b?c匹配可选的 bc

关于regex - 负向后查找在可选 token 之前失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24858659/

相关文章:

php - 按空格拆分字符串

javascript - 如何在查找字符串中的所有 url 时停止显示 mailto

php - 正则表达式 - Unicode 属性引用和示例

regex - Perl 正则表达式 : How to grab the part that is the same

ruby - Ruby lookbehind 断言 (1.9/2.0) 中是否存在错误?

Python 正则表达式lookbehind 交换组

javascript - 保加利亚语正则表达式(有效)日期格式 d.M.yyyy 'г.'

c - GCC 编译器无法找到 pcre.h

Java RegEx 后视构造

regex - 在Elasticsearch字词查询中使用正则表达式