使用正则表达式查找包含某个词但不包含另一个词的文件

13

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

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


1
这个问题不是链接的所谓答案重复的。这个问题询问的是搜索包含一个字符串但不包含另一个字符串的文件。链接的问题则关注于一个包含一个子字符串但不包含另一个子字符串的单个字符串。两件完全不同的事情。 - ryyker
1
@ryyker 你错了,这个问题的被接受的答案(除了搜索项本身)与重复问题中的答案完全相同。区别在于你是在单个文件中搜索还是在所有文件中搜索,这取决于工具的搜索方式,而不是搜索正则表达式本身。 - Mark Rotteveel
@MarkRotteveel - 您仅从解决正则表达式问题的角度来看待这两个问题。对于一个问题,只要求解单个字符串的正则表达式解决方案是可以的。但是另一个问题涉及到两个独特的需求:1)可以在OP正在使用的工具中使用正则表达式吗?2)如果可以,在整个文件中搜索以满足其准则的文件的哪种形式的正则表达式表达式可以被用于隔离这些文件?即使是满足两个OP问题的解决方案也是不同的。(请注意下面已接受答案的最后一行。) - ryyker
@MarkRotteveel - 即\s\S是关键,它确保整个文件被搜索而不是每一行。 - ryyker
4个回答

18

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

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

它会找到每个包含 INCLUDED_TERM 但不包含 MISSING_TERM 的文件,而不考虑行。

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


3

如果您想将其显示在单行中,请像这样使用:

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

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


1
非常好的答案 (y)。加油兄弟。 - Sudhanshu Gaur

0

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

正则表达式可能会变得有点棘手,但它可以分解为两个部分。

  1. 查找匹配的术语/短语/单词。这部分并不太复杂,因为这是正则表达式通常要查找的内容。
  2. 查找不存在的术语。这是比较棘手的部分,但是也是可以实现的。

我有一个示例,展示了如何在文本中查找单词connectReadOnly,并且未能找到disconnect。由于文本包含connectReadOnly,它开始查找下一个部分,但没有找到disconnect。由于disconnect在文本中,它会在整个字符串上失败(这是您需要匹配整个文件的内容)。如果您玩弄第二部分,否定部分(?!.*disconnect.*),您可以将其设置为任何您需要的正则表达式。在我的示例中,我不想在代码中任何地方找到disconnect :) 您可以轻松地将其替换为要搜索的单词,甚至是更复杂的“不要找”的正则表达式。

关键是使用多行模式,这可以通过使用开头的(?m)来设置,然后使用字符串的开始/结束字符。使用^$来开始/结束一行,其中\A\z开始和结束一个字符串,从而将匹配扩展到整个文件。
编辑:对于connectReadOnlydisconnect问题,请使用:(?m)\A(?=.*connectReadOnly)(?!.*disconnect.*).*\z。更新的示例可以在此处找到。

这似乎接近了,但仍然返回许多误报(例如同时包含两个术语的文件)。这是我尝试过的表达式,但它会返回同时包含两个术语的文件:(?m)^(?=.connectReadOnly)((?!disconnect).)$我的目标是查找任何行中具有“connectReadOnly”但缺少“disconnect”术语的文件。 - Fred
@SAL 答案已经进行了修改,请尝试一下...现在应该可以正常工作了 :) - Walls
那也不起作用。我在想,也许Eclipse中的正则表达式解析器与您使用的不同? 经过从各种来源汇集提示后,我发现以下内容可行:^(?!.[\s\S]*disconnect).[\s\S]connect.$ - Fred

0
你可以使用类似以下的代码:
(?<!.*bar)foo(?!.*bar)

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接