【发布时间】:2013-03-04 19:39:03
【问题描述】:
我正在尝试快速查找包含一个术语但缺少另一个术语的所有 .java 文件。我正在使用 MyEclipse 10.7 及其“搜索 |文件搜索功能,支持正则表达式。
正则表达式在这种情况下可以工作吗?正确的正则表达式是什么?
TIA, 史蒂夫
【问题讨论】:
我正在尝试快速查找包含一个术语但缺少另一个术语的所有 .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。
【讨论】:
你可以使用类似的东西:
(?<!.*bar)foo(?!.*bar)
如果找到“foo”但没有找到“bar”,则匹配。
注意:您必须将搜索引擎配置为使用多行正则表达式(例如:Notepad++ 有一个名为“.matches newline”的选项),因为通常点表示任何字符除了 换行符。
【讨论】:
(?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找到。
【讨论】: