2013-01-16 57 views
4

問題是我想匹配評論任何一方的所有文本,並排除評論本身。正則表達式匹配所有排除塊評論

有很多'評論'相關的正則表達式的帖子,但大多數是在其他語言(我使用記事本++,其中維基百科告訴我是POSIX ERE,我們不討論語言或工具),並且大多數都集中在找到評論,我已經完成了。

這將找到包含文字我渴望(這將包括在比賽中的內部塊註釋):

(^)rule ((.|\n|\r)*?)(^)end 

上述發現「規則」和「結束」,(含)之間任何東西。精細。

這將找到塊註釋:

(?:/\*(?:(?:[^*]|\*(?!/))*)\*/) 

上述發現/**/(含)之間任何東西。精細。我不擔心在評論中是否有*/之一,而不是我的情況。

現在的問題是如何在上面的正規規則匹配的中間將塊註釋放入否定位置,以便匹配RULEEND之間的所有內容(註釋文本除外)?

如果您的答案不包含單行//評論,也可獲得積分。

+0

你到底想幹什麼?是否有可能只使用您的塊註釋匹配模式,然後刪除匹配? –

+0

實際上,記事本++的最新版本正在使用Phillip Hazel功能強大且功能強大的[PCRE regex庫](http://www.pcre.org/),它提供了高級的Perl 5正則表達式構造。 Wiki中的信息可能有點陳舊。關於你手頭的問題 - 這可能不能用一個正則表達式來完成(取決於你正在編輯的源代碼語言)。 – ridgerunner

+0

在發佈之前,我的想法是使用正面評論匹配並消除評論,這是我們將要做的,因爲我們的示例集足夠小。我發現類似的帖子也表示這種情況正在碰到正則表達式可以做的限制。感謝您的回覆。乾杯! – user1984308

回答

0

讓我開始說:正則表達式不是要做到這一點!

但它不是不可能的:

  • 匹配一切從「統治」到「結束」,或註釋塊的開始,其經過進一步的匹配一切「:它可以用遞歸的正則表達式來完成結束」,或註釋塊的開始,其經過進一步的匹配一切‘結束’OR等。
當然

只捕捉‘萬物’

翻譯爲:

^rule((?:.|\r|\n)*?)(?:^end|(?:(?://$|/\*(?:(?:[^*]|\*(?!/))*)\*/))) 
                   ^
                  put cursor there 
                   and insert 
          ((?:.|\r|\n)*?)(?:^end|(?:(?://$|/\*(?:(?:[^*]|\*(?!/))*)\*/))) 
                   or end with 
          (?:\r?\n^end) 

然後用更換

$ 1 $ 2 $ 3 $ $ 4 ..

其中取代數目應該匹配遞歸

測試記事本的極限數量++我建立這個小提琴:

http://jsfiddle.net/lovinglobo/wPKjb/

記事本++通過簡單地超過29個遞歸休息說「無效正則表達」。

0

如果能夠翻轉您的要求,而是刪除從源頭上所有的意見,你可以用這個模式來匹配註釋行(塊行):

/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s