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