Eclipse文件搜索对话框 – 组联合和否定的正则表达式
我想在任何给定项目/工作区内的给定文件类型中搜索两个(或更多)单词(或者你可以说是组)。
我需要一个高效的正则表达式用于以下查询(在多线模式下)使用它eclipse 文件搜索对话框 (见下图。你可以按Ctrl + H打开搜索对话框)
- Word 1首先出现,Word 2出现
- Word 1现在但Word 2不得出现在任何地方。
- Word 1和Word 2都必须在文件中存在任何地方(ORDER无关紧要,即群组联盟)
- Word 1不得在文件中任何地方出现。(即群组否定)
- Word 1现在或Word 2在文件中任意存在(ORDER无关紧要)
编辑
我得到了第一名
- (?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
; 当然, word1
和word2
是可以互换的。
(4) (?s)\A(?!.*?word1).?
并且只使用负向前瞻来搜索word1
的缺失; 如果没有.?
只匹配一个可选字符,因为空正则表达式在DOTALL
模式下不匹配任何内容。
(5) (?s)\A.*?(word1|word2)
说明word1
或word2
满足是直截了当的。
当然,如果您要查找整个单词,上面的word
占位符必须替换为\bactualwordcharacters\b
。