2013-03-04 39 views
9

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

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

TIA, 史蒂夫

回答

12

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

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

它发现每一个文件,其中包括INCLUDED_TERM,但缺乏MISSING_TERM,无论行。

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

+0

就像一个魅力。 – 2014-09-03 07:09:45

0

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

正则表达式可以得到有点棘手,但它分解成两个部分。

  1. 找到相符的术语/短语/单词。这部分不是太棘手,因为这是正则表达式通常会寻找的东西。
  2. 找到不存在的术语。这是棘手的部分,但它是可能的。

我有这表明你要如何找到在文本字connectReadOnly,并无法找到disconnect一个例子HERE。由于该文本包含connectReadOnly,因此它开始寻找下一个作品,未找到disconnect。由于disconnect在文本中,它在整个字符串上失败(您需要为整个文件匹配)。如果你玩第二块,否定部分(?!.*disconnect.*),你可以将它设置为你需要的任何正则表达式。在我的示例中,我不想在我的代码中的任何位置找到disconnect :)您可以轻松地用您的单词替换该单词以进行搜索,甚至可以使用更复杂的正则表达式来“找不到”。

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

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

+0

这似乎很接近,但仍然返回一些误报(例如包含这两个词的文件)。这是我尝试的表达式,但返回包含这两个词的文件: (?m)^(?=。* connectReadOnly)((?! disconnect)。)* $ 我的目标是找到具有' connectReadOnly'在任何行上,但缺少术语'断开连接'。 – Fred 2013-03-05 02:37:31

+0

@SAL已对此答案进行了更改,请尝试一下......现在应该可以使用:) – Walls 2013-03-05 19:59:57

+0

这也不起作用。我想知道是否Eclipse中的正则表达式解析器与你正在使用的不同? 我在找到各种来源提示后找到的作品是:^(?!。[\ s \ S] * disconnect)。[\ s \ S] * connect。* $ – Fred 2013-03-06 01:07:51

0

您可以使用类似:

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

如果“foo”被发现,但将匹配“酒吧”不是。

注意:您必须配置使用正则表达式多搜索引擎(EX:记事本+ +有一个叫做一个选项“相匹配换行。”),因为通常的点代表任意字符除了换行符。

1

如果你想找到它的单行线,像这样使用:

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

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

+0

实际上,我在另外一个问题上提出了这个问题,但是我被低估为雷电。这就是为什么我回答你的问题。我相信这个信息应该坚持在计算器上。除此之外,我非常伤心。 – leventunver 2017-04-20 10:37:32

+1

非常好的答案(y)。 Viva住broda。 – 2017-05-17 20:48:15

相关问题