【问题标题】:What does this combination of positive and negative lookahead do? [duplicate]这种正负前瞻的组合有什么作用? [复制]
【发布时间】:2021-01-25 22:35:14
【问题描述】:

最近我偶然发现了这个奇怪的 REGEX,它是正负前瞻的组合,我无法理解它的真正作用。请记住,这是一些 Java 正则表达式语法。

(?=((?!\bword1\b|\bword2\b).)+?\s*?)
 ^^  ^^

这两个嵌套的前瞻是做什么的?这可以简化吗?

【问题讨论】:

  • 一个相关的问题是它应该做什么?您应该能够从上下文中确定这一点。我要说的是:不要低估正则表达式不正确的可能性。如果是这样,那么更有效地做同样(错误)的事情并不是解决方案。

标签: java regex regex-lookarounds


【解决方案1】:
  • . 在“word1”或“word2”(可以简化为\bword1\b|\bword2\b\bword[12]\b)中,在非单词之间匹配。这就是否定断言的意思,
  • +? 表示至少有一个这样的.
  • 但实际上只有一个,因为量词是非贪婪的,后面跟着总是匹配的\s*。所以+?可以去掉,
  • 此断言中的\s*? 毫无意义,因为它始终匹配,并且不消耗任何输入,并且不跟随任何内容,
  • 此处的肯定前瞻断言(?=...) 表示该位置后跟任何字符(如上所述的“w”“word”等除外)。

进一步的简化将删除组捕获,这在上下文中可能是必需的。

所以,简化的正则表达式是(?=((?!\bword[12]\b).))。它将在输入的任何字符之前成功,除了在非单词之间的“word1”或“word2”的开头。匹配项将为空,但第一个捕获组将包含以下字符。

https://regex101.com/r/O10c3u/1

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多