我正在尝试快速查找包含一个术语但缺少另一个术语的所有.java文件。我正在使用MyEclipse 10.7及其“搜索” “文件搜索”功能,支持正则表达式。
正则表达式在这种情况下会起作用吗?正确的正则表达式是什么?
TIA, 史蒂夫
答案 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
正则表达式可能有点棘手,但它分为两部分。
我有一个示例HERE,其中显示了您希望如何在文本中找到单词connectReadOnly
,但找不到disconnect
。由于文字包含connectReadOnly
,因此它开始寻找下一部分,而不是disconnect
。由于disconnect
位于文本中,因此整个字符串都会失败(整个文件需要匹配的内容)。如果您使用第二部分,即否定部分(?!.*disconnect.*)
,您可以将其设置为您需要的正则表达式。在我的示例中,我不想在我的代码中的任何地方找到disconnect
:)您可以轻松地将其替换为您的单词以进行搜索,或者甚至更复杂的正则表达式以“找不到”。
关键是使用多行模式,使用开头(?m)
设置,然后使用字符串字符的开头/结尾。使用^
和$
开始/结束一行,\A
和\z
开始和结束字符串,从而在整个文件中扩展匹配。
编辑:对于connectReadOnly
和disconnect
问题,请使用:(?m)\A(?=.*connectReadOnly)(?!.*disconnect.*).*\z
。可以找到更新的示例here。
答案 3 :(得分:0)
您可以使用以下内容:
(?<!.*bar)foo(?!.*bar)
如果找到“foo”但匹配“bar”,则匹配。
注意:您必须将搜索引擎配置为使用多行正则表达式(EX:Notepad ++有一个名为“匹配换行符”的选项),因为通常点代表除换行符之外的任何字符。