【问题标题】:Regex to match a pattern, but exclude a set of words正则表达式匹配模式,但排除一组单词
【发布时间】:2009-07-24 02:01:33
【问题描述】:

我一直在查看 SO,虽然这个问题已经在一种情况下得到了回答:

Regex to match all words except a given list

这不是我想要的。我正在尝试编写一个正则表达式,它匹配 [\w]+[(] 形式的任何字符串,但不匹配三个字符串“cat(”、“dog(”和“sheep(”)。

我一直在玩lookahead 和lookbehind,但我不能完全做到。我可能过于复杂了,所以任何帮助将不胜感激。

【问题讨论】:

    标签: regex


    【解决方案1】:

    如果正则表达式实现支持look-ahead or look-behind assertions,您可以使用以下内容:

    • 使用否定的前瞻断言:

       \b(?!(?:cat|dog|sheep)\()\w+\(
      
    • 使用否定的后视断言:

       \b\w+\((?<!\b(?:cat|dog|sheep)\()
      

    我添加了标记word boundary\b 锚点。所以catdog( 会被匹配,尽管它包含dog(

    但是,虽然正则表达式实现更广泛地支持前瞻断言,但带有后瞻断言的正则表达式更有效,因为它仅在前面的正则表达式(在我们的例子中为 \b\w+\()已经匹配时才进行测试。然而,先行断言将在实际正则表达式匹配之前 进行测试。所以在我们的例子中,只要匹配\b,就会测试前瞻断言。

    【讨论】:

    • 第二个最有可能是有效的,因为它不会以负面的前瞻性检查每个位置(值得注意的是它们是负面的。)另外,我认为它可能是最好将否定的后视放在括号之后,并在后视中包含括号。这样,它只会在找到可能的匹配项后才执行额外的查找,而不是针对字符串中的每个单词。
    • 另外,您的第一个正则表达式将拒绝catastrophe(dogmatic(sheepily(。您的第二个被后视中的\b 从类似的错误中拯救出来。
    • 对,我试了一下 > grep '\b(?!(?:cat|dog|sheep))\w+[(]' text.txt text.txt cat() dog( ) catdog() something() 而且它没有返回任何东西。我也尝试了 textmate 的正则表达式搜索,但是 nada。我可以看到第一条语句背后的逻辑,也许这是一个兼容性问题?我想看看 -前进是相当标准的。我今天肯定一直在以某种形式使用它。
    • 啊,没有回车,第二个text.txt表示文件的内容。
    • grep 使用 POSIX 正则表达式,而不是 PCRE,两者略有不同。我不认为 POSIX 标准包括后瞻或前瞻。
    【解决方案2】:

    您真的需要在单个正则表达式中这样做吗?如果不是,那么最简单的实现就是两个正则表达式 - 一个用于检查您不匹配您的禁用词之一,另一个用于匹配您的 \w+,用逻辑 AND 链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-01
      • 2022-12-11
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多