2016-04-07 81 views
1

我有一些帶有代碼的文本文件。用於以編程方式刪除所有評論的Java正則表達式

/*Comment here*/ 

public void start(Stage primaryStage) throws Exception{ 
    Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
    primaryStage.setTitle("First"); 
/*Comment here 
*and 
*here*/ 
    primaryStage.setScene(new Scene(root, 640, 480)); 
    primaryStage.show();//Comment this 
//and comment that 
} 

,使它看起來像這樣:

public void start(Stage primaryStage) throws Exception{ 
    Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
    primaryStage.setTitle("First"); 
    primaryStage.setScene(new Scene(root, 640, 480)); 
    primaryStage.show(); 
} 

我已經試過這樣:

public String delComments(String content){ 
    Pattern regex = Pattern.compile("/\\*.*?\\*/|/{2,}[^\\n]*", Pattern.MULTILINE); 
    Matcher matcher = regex.matcher(content); 
    String clean = content.replaceAll("(?s:/\\*.*?\\*/)|//.*", ""); 
    return clean; 
} 

方法讀取文件,並替換所有

public void delCommentAction(ActionEvent actionEvent) throws IOException { 
    String line = null; 
    FileReader fileReader = 
      new FileReader(filePath); 
    BufferedReader bufferedReader = 
      new BufferedReader(fileReader); 
    FileWriter fw = new FileWriter(filePathNoComm); 
    BufferedWriter bw = new BufferedWriter(fw); 
    while((line = bufferedReader.readLine()) != null) { 
     bw.write(delComments(line)); 
    } 
    bw.close(); 
} 

但它不起作用(評論未被刪除)

+3

我認爲這對於單個正則表達式來說非常重要。您應該嘗試使用propper解析器解析代碼並使用它查找註釋。 – SomeJavaGuy

+0

你可以試試['「//.*[\r\n]*|((#"[^\\\\\\"]*(?:\\\\.[[\\\\\\\\\\\\] )* \ 「?)|/\\ * [^ *] * \\ * +(:[^/*] [^ *] * \\ * +)* /」'](https://regex101.com/R/yU4aU5/1)。 –

回答

1

正如評論中所建議的那樣,您應該使用完整的解析器,因爲Java語言對於正則表達式來說太複雜,無法準確執行此操作。

不過,如果你都OK了一些注意事項,可以用下面的正則表達式來完成:

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

regex101 for demo

在Java代碼中,這將是:

String clean = original.replaceAll("(?s:/\\*.*?\\*/)|//.*", ""); 

警告:它不能識別字符串文字和/*//字符串文字不啓動Java註釋中。然而,這個正則表達式會認爲它是一個,並從字符串文字(以及其他)中刪除內容。


展開的版本是:

String clean = original.replaceAll("/\\*[^*]*(?:\\*(?!/)[^*]*)*\\*/|//.*", ""); 

在給定的文本沒有明顯的差異。如果3行註釋的長度爲3000個字符,則展開版本的速度會更快,但除非您進行了10000次以上的替換,否則不足以注意,所以我會考慮這種過早的優化。

+0

'(?s:/ \ *。*?\ * /)'模式可能會導致長時間評論的性能問題。展開版本更好,不需要'DOTALL'修飾符。 –

+0

@WiktorStribiżew添加了展開版本。 – Andreas

相關問題