2015-07-12 78 views
2

我正在創建一個簡單的項目,這是一個簡單的IDE。如何使用String.replaceAll函數替換Pattern.DOTALL?

我正在檢測IDE中的源代碼(長字符串)的註釋並將其刪除。

我已經嘗試了許多正則表達式來檢測的意見和這個表達式一直工作最始終如一地爲我檢測評論:

Pattern commentsSingle = Pattern.compile("\\/\\/.*"); 
Pattern commentsMulti = Pattern.compile("\\/\\*.*?\\*\\/", Pattern.DOTALL); 

我想修改這個意見的檢測,能夠使用String.replaceAll評論刪除方法。

code = code.replaceAll("\\/\\/.*", ""); 

然而,多行註釋有Pattern.DOTALL,所以我不能正常使用String.replceAll方法:

我可以很容易地做到這一點對單行註釋。

任何人都可以幫助修改正則表達式或調用另一種方法,以便我可以正確地替換多行註釋嗎?

一些正則表達式我曾嘗試:

("(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)","")) 

上述正則表達式導致計算器例外有時

回答

2

相反的String.replaceAll,您可以使用replaceAll(String replacement)Matcher,那麼你就可以構造使用Pattern.DOTALL模式:

看起來像這樣:

final Pattern pattern = Pattern.compile("\\/\\*.*?\\*\\/", Pattern.DOTALL); 
final Matcher matcher = pattern.matcher(comment); 
final String strWithoutComments = matcher.replaceAll(""); 

一個例子是這樣的:

final String code = "/**\n" + 
        " * \n" + 
        " * @param args\n" + 
        " */\n" + 
        "public static void main(final String[] args) { }\n"; 
final String codeWithoutComments = Pattern.compile("\\/\\*.*?\\*\\/", Pattern.DOTALL).matcher(code) 
     .replaceAll(""); 
System.out.println(code); 
System.out.println(codeWithoutComments); 

會前打印本替換:

/** 
* 
* @param args 
*/ 
public static void main(final String[] args) { } 

而這,更換後:

public static void main(final String[] args) { } 
+1

TY漂亮的工作。 – user3188291

相關問題