正则表达式查找包含一个单词而不是另一个单词的文件

时间:2013-03-04 19:39:04

标签: regex eclipse myeclipse

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

正则表达式在这种情况下会起作用吗?正确的正则表达式是什么?

TIA, 史蒂夫

4 个答案:

答案 0 :(得分:15)

我能找到的唯一解决方案是以下Regex:

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

它会查找包含INCLUDED_TERM但缺少MISSING_TERM的每个文件,无论该行是什么。

密钥是\s\S,它确保搜索整个文件而不是每行。

答案 1 :(得分:2)

如果您想在一行中找到它,请按照以下方式使用它:

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

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

答案 2 :(得分:0)

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

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

  1. 找到匹配的字词/词组/字词。这部分并不太棘手,因为这正是正则表达式通常所需要的。
  2. 查找不存在的术语。这是棘手的部分,但它是可能的。
  3. 我有一个示例HERE,其中显示了您希望如何在文本中找到单词connectReadOnly,但找不到disconnect。由于文字包含connectReadOnly,因此它开始寻找下一部分,而不是disconnect。由于disconnect位于文本中,因此整个字符串都会失败(整个文件需要匹配的内容)。如果您使用第二部分,即否定部分(?!.*disconnect.*),您可以将其设置为您需要的正则表达式。在我的示例中,我不想在我的代码中的任何地方找到disconnect :)您可以轻松地将其替换为您的单词以进行搜索,或者甚至更复杂的正则表达式以“找不到”。

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

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

答案 3 :(得分:0)

您可以使用以下内容:

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

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

注意:您必须将搜索引擎配置为使用多行正则表达式(EX:Notepad ++有一个名为“匹配换行符”的选项),因为通常点代表换行符之外的任何字符。