2013-02-20 50 views
3

我想寫一個正則表達式來查找文本中的所有註釋。 例如,所有介於/* */之間。 例子:要移除評論的正則表達式

/* *你好/

當我這樣做:/\*.*\*/,它的行爲古怪,並沒有什麼表示。它有什麼問題?

編輯:意見可以在多行

+0

這可能是'/'是正則表達式的分隔符。也許'/\/\*.*\*\//'這會起作用。 – flec 2013-02-20 09:02:20

+0

還請包括您正在嘗試執行此操作的語言和一些測試代碼。 – Dukeling 2013-02-20 09:02:58

+0

在這裏工作..你正在使用哪種語言? – 2013-02-20 09:03:09

回答

11

傳播與上面的例子中發佈,你試圖以匹配橫跨多行註釋。默認情況下,.與換行符不匹配。因此,您必須在正則表達式中啓用多行模式才能匹配多行註釋。

此外,您可能需要使用.*?而不是.*。否則,它會使最大的匹配成爲可能,這將是首次公開評論和最後一次密切評論之間的所有內容。

我不知道如何在Sublime Text 2中啓用多行匹配模式。我不確定它是否可用作模式。但是,可以使用CTRL + Enter將換行符插入實際模式。所以,我建議這種替代:

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

如果崇高的文本2無法識別\n,你可以選擇使用Ctrl + Enter以插入的方式換行,代替\n

+1

[一些](http://docs.sublimetext.info/en/latest/search_and_replace/search_and_replace_overview.html)[參考](http://www.boost.org/doc/libs/1_47_0/libs/regex/doc /html/boost_regex/syntax/perl_syntax.html)。 – Dukeling 2013-02-20 09:23:19

+0

那麼在這種情況下會怎樣呢? – Jatin 2013-02-20 09:29:51

+0

'/ \ *([^ *] | [\ r \ n] |(* * +([^ * /] | [\ r \ n])))* \ * + /'這樣做的工作 – Jatin 2013-02-20 09:31:16

5

幾年前我遇到過這個問題,wrote an entire article about it

如果您沒有訪問到非貪婪匹配(不是所有的正則表達式庫支持非貪婪),那麼你應該使用這個表達式:如果你有機會獲得非貪婪匹配

那麼你可以使用:

/\*(.|[\r\n])*?\*/ 

另外,請記住,正則表達式只是這個問題的啓發式。正則表達式不支持其中一些似乎是正則表達式註釋,但實際情況並非如此:

someString = "An example comment: /* example */"; 

// The comment around this code has been commented out. 
// /* 
some_code(); 
// */ 
0

正確的答案 - 這是不可能的。您不能編寫能夠正確查找所有註釋或正則表達式的正則表達式 - 單行或多行註釋。

正則表達式只能提供部分匹配,其中一個可能會覆蓋所有情況的90%,但就是這樣。

正則表達式的語法非常複雜,只有通過執行完整表達式評估才能在100%的情況下正確識別它們,而這又是基於對代碼進行標記的。後者是一項巨大的任務,現在由所有AST解析器實現。請參閱AST Explorer

只有正確書寫的AST解析器可以精確地告訴您所有正則表達式在代碼中的位置。你將不得不編寫一個解析器,然後基於此。或者,您可以使用已經完成所有操作的現有庫之一,如decomment。其中任何正面的做法是要


正則表達式的例子絆倒,暫時無法分辨註釋塊正則表達式:

  • /\// - 它會認爲這個REG-EX是一款單直插評論
  • /\/*/ - 它會認爲這個REG-EX打開多行註釋
+0

我不明白爲什麼它應該是不可能的。你能否展示一個你認爲不容易處理的代碼示例? – 2016-10-19 17:07:16

+0

確實,沒有合適的解析器並不容易,但它確實不是不可能的。如果你只是需要這樣的一次性任務,那麼編寫你所需要的功能就容易了,而不是爲你的語言推出一個完整的解析器! – Thomas 2016-10-22 11:09:43

+0

OP想要使用文本編輯器*匹配代碼註釋*。一個完全合理的,有用的事情要做。 – 2017-04-06 11:36:31

0

只是關於使用正則表達式去除編程語言文件中的註釋的一個附加註釋。

警告!

這樣做,你一定不要忘記,你有串/**/在字符串中的代碼的情況下 - 就像var string = "/*"; - (我們永遠不會知道,如果你分析一個龐大的代碼,是不是你)!

所以最好的是用編程語言解析文檔,並有一個布爾值來保存打開的字符串的狀態(並忽略打開的字符串內的任何匹配)。

再次由"分隔的字符串可以包含\"所以要注意正則表達式!

0

只是想增加對HTML註釋是爲這個

\<!--(.|\n)*?-->