Eclipse文件搜索对话框 – 组联合和否定的正则表达式

我想在任何给定项目/工作区内的给定文件类型中搜索两个(或更多)单词(或者你可以说是组)。

我需要一个高效的正则表达式用于以下查询(在多线模式下)使用它eclipse 文件搜索对话框 (见下图。你可以按Ctrl + H打开搜索对话框)

在此处输入图像描述

  1. Word 1首先出现,Word 2出现
  2. Word 1现在但Word 2不得出现在任何地方。
  3. Word 1和Word 2都必须在文件中存在任何地方(ORDER无关紧要,即群组联盟)
  4. Word 1不得在文件中任何地方出现。(即群组否定)
  5. Word 1现在或Word 2在文件中任意存在(ORDER无关紧要)

编辑

我得到了第一名

  1. (?m)(?s)(Word 1)。*(Word 2)

但不适合其他人。

当您希望提高搜索效率时,您必须了解不同的目标:Eclipse搜索function会查找所有匹配项,但您只想检查是否存在单词。

对于单个单词,您可以只搜索word但由于您要使用无界量词搜索组合,因此效果不佳。

所以你要做的第一件事就是阻止Eclipse(正则表达式引擎)在文件的每个字符位置检查匹配,方法是添加一个锚\A代表“文件的开头”。 然后跳过尽可能少的字符并搜索文字匹配以检查是否存在:

(?s)\A.*?word将搜索第一个出现的word但不会进一步搜索。

扩展它以便按顺序检查两个单词很简单:

(1) (?s)\A.*?word1.*?word2只检查每个单词的一次出现,但仅此而已。

要在没有订单的情况下检查是否存在,您可以使用预测:

(2) (?s)\A(?!.*?word2).*?word1简单地否定word2 ,告诉word2不得出现……

(3) (?s)\A(?=.*?word1).*?word2如果存在一个匹配的word1则找到一个匹配的word2 ; 当然, word1word2是可以互换的。

(4) (?s)\A(?!.*?word1).? 并且只使用负向前瞻来搜索word1的缺失; 如果没有.? 只匹配一个可选字符,因为空正则表达式在DOTALL模式下不匹配任何内容。

(5) (?s)\A.*?(word1|word2)说明word1word2满足是直截了当的。

当然,如果您要查找整个单词,上面的word占位符必须替换为\bactualwordcharacters\b