【问题标题】:regex to find files containing one word but not another [duplicate]正则表达式查找包含一个单词但不包含另一个单词的文件[重复]
【发布时间】:2013-03-04 19:39:03
【问题描述】:

我正在尝试快速查找包含一个术语但缺少另一个术语的所有 .java 文件。我正在使用 MyEclipse 10.7 及其“搜索 |文件搜索功能,支持正则表达式。

正则表达式在这种情况下可以工作吗?正确的正则表达式是什么?

TIA, 史蒂夫

【问题讨论】:

    标签: regex eclipse myeclipse


    【解决方案1】:

    我能找到的唯一解决方案是以下正则表达式:

    ^(?!.[\s\S]*MISSING_TERM).[\s\S]*INCLUDED_TERM.*$
    

    它会找到每个包含INCLUDED_TERM 但缺少MISSING_TERM 的文件,无论哪一行。

    关键是\s\S,它确保搜索整个文件而不是每一行。

    【讨论】:

      【解决方案2】:

      如果你想在一行中找到它,可以这样使用:

      ^(?!.*MISSING_TERM).*INCLUDED_TERM.*$
      

      您也可以使用\ 作为转义字符,因为您可能需要它,如class\.variable

      【讨论】:

      • 非常好的答案(y)。 viva live broda。
      【解决方案3】:

      你可以使用类似的东西:

      (?<!.*bar)foo(?!.*bar)
      

      如果找到“foo”但没有找到“bar”,则匹配。

      注意:您必须将搜索引擎配置为使用多行正则表达式(例如:Notepad++ 有一个名为“.matches newline”的选项),因为通常点表示任何字符除了 换行符。

      【讨论】:

        【解决方案4】:

        (?m)\A(?=.*REGEX_TO_FIND)(?!.*MISSING_REGEX.*).*\z

        正则表达式可能有点棘手,但它分为两部分。

        1. 查找匹配的术语/短语/单词。这部分并不太棘手,因为这是正则表达式通常寻找的内容。
        2. 查找不存在的术语。这是棘手的部分,但有可能。

        我有一个示例HERE,它显示了您希望如何在文本中找到单词connectReadOnly,但找不到disconnect。由于文本包含connectReadOnly,它开始寻找下一段,而不是找到disconnect。由于disconnect 在文本中,它在整个字符串上都失败了(你需要什么来匹配整个文件)。如果您使用第二个部分,即否定部分(?!.*disconnect.*),您可以将其设置为您需要的任何正则表达式。在我的示例中,我不想在代码中的任何位置找到 disconnect :) 您可以轻松地将其替换为要搜索的单词,甚至可以使用更复杂的正则表达式来“找不到”。

        关键是使用多行模式,使用开头(?m)设置,然后使用字符串字符的开始/结束。使用^$ 开始/结束一行,其中\A\z 开始和结束一个字符串,从而将匹配扩展到整个文件。

        编辑:对于connectReadOnlydisconnect 问题使用:(?m)\A(?=.*connectReadOnly)(?!.*disconnect.*).*\z。更新后的例子可以在here找到。

        【讨论】:

        • 这看起来很接近,但仍会返回一些误报(例如包含两个术语的文件)。这是我尝试过的表达式,但返回的文件包含两个术语: (?m)^(?=.*connectReadOnly)((?!disconnect).)*$ 我的目标是找到在任何文件上都有“connectReadOnly”的文件行,但缺少“断开连接”一词。
        • @SAL 已对答案进行了更改,请尝试一下...现在应该可以使用了 :)
        • 那也不行。我想知道 Eclipse 中的正则表达式解析器是否与您使用的不同?在将各种来源的提示拼凑在一起后,我发现的作品是:^(?!.[\s\S]*disconnect).[\s\S]*connect.*$
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        相关资源
        最近更新 更多