【问题标题】:Regex for matching lines that do NOT contain a word用于匹配不包含单词的行的正则表达式
【发布时间】:2010-10-26 23:45:36
【问题描述】:

我有以下几行:

Message:Polarion commit Mon May 18 06:59:37 CEST 2009
Message:Polarion commit Fri May 15 19:39:45 CEST 2009
Message:424-18: use new variable
Message:Polarion commit Fri May 15 19:29:10 CEST 2009
Message:Polarion commit Fri May 15 19:27:23 CEST 2009
Message:000-00: do something else
Message:Polarion commit Fri May 15 17:50:30 CEST 2009
Message:401-103: added application part
Message:Polarion commit Fri May 15 17:48:46 CEST 2009
Message:Polarion commit Fri May 15 17:42:04 CEST 2009

我想得到所有不包含“Polarion”的行

我该怎么做?

ps:我看到了: Regex to match against something that is not a specific substring 但这对我没有帮助

pps:我正在尝试在 tortoiseSVN 中执行此操作以选择日志消息,我认为“负面后视”存在问题

【问题讨论】:

  • 请将代码和示例纯文本文件缩进四个空格,以确保格式正确。您可以通过选择文本并按 ctrl-k 来执行此操作。干杯。
  • 并非所有的正则表达式引擎都支持负向回溯 - TortoiseSVN 很可能不支持。

标签: regex tortoisesvn


【解决方案1】:

正如this answer 所示,TortoiseSVN 的搜索框不限于正则表达式。具体来说,如果一个表达式包含在!( ) 中,它会被否定并且不匹配的行会出现在结果中。 ! 否定封闭的表达式(正则与否)。

对于你的情况,

!(Polarion)

应该可以解决问题。

【讨论】:

    【解决方案2】:

    这对我很有用并且可以快速输入(在搜索对话框等中):^(?!.*not this).*but this

    【讨论】:

      【解决方案3】:

      如果你让你的正则表达式匹配你正在寻找的东西然后反转结果可能会更容易。

      大多数使用 Regex 的工具都允许您反转搜索结果,通常调用选项 'v' 表示 inVert(保持 i 表示大小写 -Insensitive) :

      例如

      grep -v <search>
      find /v <search>
      

      等等

      【讨论】:

      • 嗯,第一个粗体文本,反转中的 v 在预览中显示得很好,但在这里看起来不对...
      • 星号并不打算在单词中使用,但 ... 应该可以。这不是我第一次看到预览窗格给出虚假结果。
      【解决方案4】:

      这是一个使用负前瞻的解决方案,它比后视得到更广泛的支持:

      ^Message:(?!Polarion).*$
      

      (另外,因为我们知道 Polarion 可能出现在哪里,所以我们不需要做任何 Daniel 建议的毫无意义的花哨的事情。)


      正则表达式注释形式对上述表达式的解释是:

      (?x)       # Enable comments
      ^          # Start of string (start of line in multiline mode)
      Message:   # Literal text
      (?!        # Begin negative lookahead
      Polarion   # Literal text
      )          # End negative lookahead
      .*         # Greedily match any number of any character
      $          # End of string (end of line in multiline mode)
      

      【讨论】:

        【解决方案5】:

        我找不到任何关于 TortoiseSVN 使用什么正则表达式引擎的信息,但你可以在 mailing list 上提问。并非所有引擎都支持零宽度负向后查看等高级功能。

        【讨论】:

          【解决方案6】:

          这个表达式可以完成这项工作。

          ^(?:.(?<!Polarion))*$
          

          它使用零宽度的否定后向断言来断言字符串不包含“Polarion”。

          ^ 锚定到字符串的开头 (?: 非捕获组 .匹配任意字符 (?

          以下版本将仅在“n”之后执行断言 - 可能会更快,也可能更慢。

          ^(?:[^n]*|n(?<!Polarion))*$
          

          【讨论】:

          • 有趣的答案,但 grep -v 要简单得多。
          猜你喜欢
          • 2017-02-06
          • 2022-12-11
          • 2016-01-14
          • 1970-01-01
          相关资源
          最近更新 更多