我正在尝试快速查找所有包含一个术语但缺少另一个术语的.java文件。我正在使用MyEclipse 10.7及其支持正则表达式的“搜索|文件搜索”功能。
在这种情况下,正则表达式能起作用吗?正确的正则表达式是什么?
我正在尝试快速查找所有包含一个术语但缺少另一个术语的.java文件。我正在使用MyEclipse 10.7及其支持正则表达式的“搜索|文件搜索”功能。
在这种情况下,正则表达式能起作用吗?正确的正则表达式是什么?
我找到的唯一可行的解决方案是以下正则表达式:
^(?!.[\s\S]*MISSING_TERM).[\s\S]*INCLUDED_TERM.*$
它会找到每个包含 INCLUDED_TERM
但不包含 MISSING_TERM
的文件,而不考虑行。
关键在于 \s\S
,它确保搜索整个文件而不是每一行。
如果您想将其显示在单行中,请像这样使用:
^(?!.*MISSING_TERM).*INCLUDED_TERM.*$
您还可以使用\
作为转义字符,因为您可能需要像class\.variable
这样的字符。
(?m)\A(?=.*REGEX_TO_FIND)(?!.*MISSING_REGEX.*).*\z
正则表达式可能会变得有点棘手,但它可以分解为两个部分。
我有一个示例,展示了如何在文本中查找单词connectReadOnly
,并且未能找到disconnect
。由于文本包含connectReadOnly
,它开始查找下一个部分,但没有找到disconnect
。由于disconnect
在文本中,它会在整个字符串上失败(这是您需要匹配整个文件的内容)。如果您玩弄第二部分,否定部分(?!.*disconnect.*)
,您可以将其设置为任何您需要的正则表达式。在我的示例中,我不想在代码中任何地方找到disconnect
:) 您可以轻松地将其替换为要搜索的单词,甚至是更复杂的“不要找”的正则表达式。
(?m)
来设置,然后使用字符串的开始/结束字符。使用^
和$
来开始/结束一行,其中\A
和\z
开始和结束一个字符串,从而将匹配扩展到整个文件。connectReadOnly
和disconnect
问题,请使用:(?m)\A(?=.*connectReadOnly)(?!.*disconnect.*).*\z
。更新的示例可以在此处找到。(?<!.*bar)foo(?!.*bar)
如果找到“foo”但未找到“bar”,则匹配。
注意:您必须配置搜索引擎使用多行正则表达式(例如,Notepad++有一个名为“。匹配换行符”的选项),因为通常点表示任何字符,除了换行符。