11

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

正则表达式会在这种情况下工作吗?正确的正则表达式是什么?

TIA,史蒂夫

4

4 回答 4

16

我能找到工作的唯一解决方案是以下正则表达式:

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

它会找到每个包含INCLUDED_TERM但缺少的文件MISSING_TERM,而不管行。

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

于 2013-03-13T15:44:58.290 回答
2

如果您想在一行中找到它,请像这样使用它:

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

您也可以\用作转义字符,因为您可能需要它,例如class\.variable.

于 2017-04-20T10:34:28.073 回答
0

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

正则表达式可能有点棘手,但它分为两部分。

  1. 找到匹配的术语/短语/单词。这部分不是太棘手,因为这是正则表达式通常寻找的。
  2. 查找不存在的术语。这是棘手的部分,但这是可能的。

我有一个示例HERE,它显示了您希望如何connectReadOnly在文本中查找单词,但无法找到disconnect. 由于文本包含connectReadOnly它开始寻找下一段,而不是找到disconnect. 由于disconnect在文本中,它在整个字符串上都失败了(整个文件匹配所需的内容)。如果您使用第二部分,即否定部分(?!.*disconnect.*),您可以将其设置为您需要的任何正则表达式。在我的示例中,我不想disconnect在我的代码中找到任何地方:) 您可以轻松地将其替换为要搜索的单词,甚至可以使用更复杂的正则表达式来“找不到”。

关键是使用多行模式,它使用(?m)字符串字符的开头然后使用开始/结尾来设置。使用^$开始/结束一行,在哪里开始\A\z结束一个字符串,从而将匹配扩展到整个文件。

编辑:对于connectReadOnlydisconnect问题使用:(?m)\A(?=.*connectReadOnly)(?!.*disconnect.*).*\z. 可以在此处找到更新的示例。

于 2013-03-04T20:06:55.297 回答
0

你可以使用类似的东西:

(?<!.*bar)foo(?!.*bar)

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

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

于 2013-03-04T20:14:43.030 回答