2016-06-21 55 views
1

我有正則表達式,應該刪除評論(你們,這是不好的,但對我來說它的工作原理)刪除除了什麼匹配正則表達式的Java的所有文字

String regex = (^\/\/.*)|(\s+\/\/.*)|((\/\*)(.|\n)+?(\*\/)); 

此代碼應刪除所有commtents

Pattern.compile(regex).matcher(some text).replaceAll(" "); 

但我怎樣才能讓它刪除所有EXCEPT正則表達式?

例如: 如果我有字符串是這樣的:

/*Comments it's cool*/ public static void foo(){}

我的正則表達式匹配的意見,但我需要刪除的內容不匹配,所以它看起來像:

/*Comments it's cool*/ 
+0

只需連接所有匹配項? – VLef

+0

哦,來吧 - 與正則表達式匹配,並將它們追加到結果字符串/緩衝區等。順便說一句,你真的很高興使用'(。| \ n)+?'?至少使用'。*?'(使用'(?s)'inline修飾符)。但是,多行註釋有更好的正則表達式。 –

+0

而'(^ \/\/.*)|(\ s + \/\/.*)'與'(\ s * \/\ /.*)'相同。 – ClasG

回答

0

基本上,你可以匹配你的正則表達式匹配,並連接匹配的文本。這很容易。

至於那個正則表達式刪除所有但你原來的模式相匹配的,你可以考慮使用一個可選的捕捉拍攝組的整個模式,並使用.後的任何字符匹配。

說,你的模式是abc。它匹配abc。但現在,您需要匹配相反的東西,正則表達式不匹配的所有東西。使用

(?s)(abc)?. 

並替換爲$1。請參閱regex demo

雖然換行符可能需要進行一些調整。如果您不想刪除換行符,請不要使用DOTALL修飾符。如果要使用它,請用原始模式替換.[^\n\r]。請記住,您可以使用某種(\r?\n|\r){2,}圖案縮小空行(並且再次引用$1反向引用)。

所以,你的正則表達式是

String regex = "^\\s*//.*|/\*[^*]*\*+(?:[^/*][^*]*\*+)*/"; 

其中/\*[^*]*\*+(?:[^/*][^*]*\*+)*/比賽多的意見,並^\\s*//.*比賽單行註釋。

爲了使刪除所有,但它匹配的東西,用

String regex = "(?sm)(^\\s*//[^\r\n]*|/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/)?."; 

$1逆向引用替換。請參閱regex demo(基於ClasG demo)。注意我還爲^添加了(?m) MULTILINE修改器,以匹配該行的開頭。

相關問題