2014-03-13 62 views
0

好的,我知道這是一個反覆出現的問題,但我似乎無法找到一個完全基於正則表達式的單一工作解決方案。因此,這就是我所想到的(實際上它基於C# sharp grammar specification by ECMA中多行註釋的'字面'描述)。使用正則表達式匹配多行C++樣式註釋

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

然而,正如你可以看到它不工作...

演示:

http://regexr.com?38gom

任何想法?這甚至可能沒有做各種黑客? (嗯,我的意思是比正則表達式本身以外...笑)


附:如果它是任何信息價值,我目前正在開發一個Lex/Bison/C/D的詞法分析器/解析器和解釋器,顯然多行註釋是一件需要考慮的事情...

+1

對於哪種語言? C++?如果是的話,請跳過我評論的其餘部分,如果不是的話 - 請不要重複C++的錯誤,它的多行註釋不能嵌套。 – greenoldman

+1

@greenoldmand感謝您的建議。不,不適用於C++。這是我自己的。 (也看看你的項目,順便說一下!;-)) –

回答

4

這是工作正則表達式從regexr.com

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

或您提供的樣本:

\/\*.*?\*\/ 
+0

好吧,好吧,好吧。 **是**,它的工作原理!我想我現在必須仔細研究它,看看我做錯了什麼...... –

+0

雖然我不明白你的正則表達式。它看起來很複雜。我剛剛分組了你的'|'裏面的括號。 –

+0

不幸的是,似乎仍然存在一個問題,現有評論無法說明問題。看看這裏:http://regexr.com?38gop –

1

如果你需要這個flex,它沒有實現非貪婪匹配,這裏是寫的正則表達式的一種方式:

[/][*][^*]*[*]+([^/*][^*]*[*]+)*[/] 

替代,對眼睛也不輕鬆:

"/*"[^*]*"*"+([^/*][^*]*"*"+)*"/" 

/不需要被引用。但明星們的確如此,而且似乎更加一致。還有一種選擇是用反斜槓引用星星,但我覺得更難讀。


如果您確實需要這個flex/lex,你會更好過把一個適當的標記,如

0

在C#中,我通過@"(?s:/\*((?!\*/).)*\*/)"獲得最佳性能。

如果您想匹配所有評論(包括在線評論),請使用@"(?>/(/[^\r\n]*|(?s:\*((?!\*/).)*\*/)))"