2016-04-07 14 views
1

Kod içeren bazı metin dosyam var.Tüm yorumları program aracılığıyla silmek için Java regex

/*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 
} 

Ve öyle gibi gözüküyor olun: dosyayı okumak ve hepsini

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(); 
} 

yerine Ama

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; 
} 

Yöntemi:

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(); 
} 

ben bu denedim çalışmıyor (yorum silinmedi)

+3

Tek bir normal ifade için bunun çok olduğunu söyleyeyim. Kodu bir çözümleyici ayrıştırıcısıyla ayrıştırmayı ve onunla yorumları bulmayı denemelisiniz. – SomeJavaGuy

+0

['" //.*[\r\n]*|(\"[^\\\\\"]*(?:\\\\.[^\\\\\"]* deneyebilirsiniz) * \ "?) |/\\ * [^ *] * \\ * + ([^/*] [^ *] * \\ * +) * /" '] (https://regex101.com/r/yU4aU5/1). –

cevap

1

Bir yorumda önerildiği gibi, tam bir ayrıştırıcı kullanmanız gerekir, çünkü Java dili bu ifadeyi doğru şekilde yapmak için çok karmaşıktır. edilecek bir kaç nokta ile Tamam

Ancak, aşağıdaki regex ile yapılabilir:

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

regex101 for demo bakınız.

Java kodunda, olurdu:

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

Uyarı: Bu dize hazır ve bir Java yorumunu başlamaz, bir dizgi içine /* veya // tanımıyor. Bu regex, bunun bir olduğunu düşünür ve içeriği dize değişmezlerinden (ve ötesinde) kaldırır.


unrolled sürümü:

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

verilen metin üzerinde hiçbir fark fark. 3 satırlı yorum 3000 karakter uzunluğundaysa, kaydedilmemiş sürüm biraz daha hızlıdır, ancak 10000'den fazla değiştirmediğiniz sürece bunu farketmeye yetmez, bu nedenle bu erken optimizasyonu düşünürdüm.

+0

'(? S:/\ *. *? \ * /) 'Deseni çok uzun yorumlar ile performans sorunlarına neden olabilir. Açılmamış bir sürüm daha iyidir ve "DOTALL" değiştiricisini gerektirmez. –

+0

@ WiktorStribiżew Açılmış sürüm eklendi. – Andreas

İlgili konular