2012-03-05 37 views
0

我嘗試使用Eclipse的RegEx搜索功能搜索單詞'foo'或'bar',忽略註釋。Eclipse RegEx搜索多個單詞,忽略註釋

這是我到目前爲止有:

^(?!\s*(//|\*)).*(foo|bar) 

我的解決方案的評論限制是沒有問題啊(反正,如果有人有不顯着延長了正則表達式一個更好的解決方案,我會很高興聽到這件事):

  • 單行註釋必須在該行的開頭開始,也許縮進(所以我不在乎return null; // foo不會被忽略)。
  • 多行註釋從行的開頭開始,帶有一個星號,可能會被忽略(因此/* foo不會被忽略,而bar \n * foo將被忽略,即使它不是真正的註釋)。

我的問題是,現在整個行('包括''富'或'欄')突出顯示在搜索結果中。我只想要'foo'或'bar'(或兩者都有,如果兩者都出現在同一行中)要突出顯示。 我想包括正前瞻(有多種型號)來實現這一目標:

^(?!\s*(//|\*))(?=.*)(foo|bar) 

這導致沒有結果。我不明白爲什麼。感謝您的任何提示!

回答

2

問題是周圍的斷言實際上並不匹配並消耗任何文本。因此,在正則表達式

^(?!\s*(//|\*))(?=.*)(foo|bar) 

文本foobar可以因爲正則表達式引擎尚未全部向前看符號匹配後,移動只在該行的開頭匹配。

這意味着如果您不希望導致高達foo/bar的文本匹配,您需要在*斷言後面查看*替代。但是,只有.NET和JGSoft正則表達式引擎支持不確定的量詞,如lookbehind斷言中的星號。 Java/Eclipse不支持這一點。

在.NET中,您可以搜索

(?<!^\s*(//|\*).*)(foo|bar) 
+0

所以 (<^ \ S *(// |!\ *){} 0,100)(FOO |巴) 做的工作Eclipse,但它速度很慢(當然還會帶來進一步的限制,即只能搜索到100 + x個字符)。無論如何,總比沒有好。感謝您的建議! – user1249995 2012-03-05 14:54:24

+0

這是我最後使用的: (?<!^ \ s {0,10}(// |(/?)\ *)。{0,200})\ b(foo | bar)\ b 它仍然很慢,但比上述版本更快。這種性能提升是通過不忽略太過分的評論來完成的。作爲一種平衡,我現在也在尋找適當的多行註釋開始(/ *),並且只搜索整個單詞(不會找到「foobar」)。 – user1249995 2012-03-06 10:02:55