2012-10-22 11 views
12

Mam ciąg znaków np.Regex zgodny z komentarzem wielowierszowym w stylu C

String src = "How are things today /* this is comment *\*/ and is your code /*\* this is another comment */ working?" 

Chcę usunąć /* this is comment *\*/ i /** this is another comment */ podciągi z ciągu src.

Próbowałem użyć wyrażenia regularnego, ale nie udało się z powodu mniejszego doświadczenia.

+6

analizowaniem kodu Java z regex nie jest coś, polecam. – Confluence

+0

@Confluence, nie jestem pewien, co może być najlepszym rozwiązaniem, aby osiągnąć wynik? Czy możesz zaproponować jeden. – hanumant

+0

Co wypróbowałeś za pomocą regex? Jak już powiedziałeś, że próbowałeś czegoś, możesz równie dobrze wkleić go tutaj, abyśmy mogli zobaczyć twoje podejście. Możemy przejść do mniej lub bardziej szczegółowych informacji na temat rozwiązań w zależności od Twoich doświadczeń. – brimborium

Odpowiedz

11

Spróbuj użyć tego wyrażenia regularnego (wyłącznie komentarze linii):

String src ="How are things today /* this is comment */ and is your code /* this is another comment */ working?"; 
String result=src.replaceAll("/\\*.*?\\*/","");//single line comments 
System.out.println(result); 

REGEX wyjaśnił:

meczów znak "/" dosłownie

Mecz znak "*" dosłownie:

"." Dopasuj dowolny pojedynczy znak

"*?" Od zera do wielu momentach, jak kilka razy, jak to możliwe, rozwijającej ile potrzeba (leniwy)

dopasować znak „*” dosłownie

Mecz znak „/” dosłownie

Alternatywnie tutaj jest regex dla pojedynczych i multi-line komentarze dodając (s):

//note the added \n which wont work with previous regex 
String src ="How are things today /* this\n is comment */ and is your code /* this is another comment */ working?"; 
String result=src.replaceAll("(?s)/\\*.*?\\*/",""); 
System.out.println(result); 

Numer referencyjny:

+5

Będzie fajnie, jeśli masz ciąg zawierający sekwencje komentarzy. – nhahtdh

+0

Czy możesz wyjaśnić, jak działa wielowierszowe wyrażenie regularne? Nie rozumiem * (? S) * (i link nie pomaga w tym zakresie). – brimborium

+0

@nhahtdh +1 Lol tak inna historia całkowicie (domyślam się, że po prostu sprawdzasz ciąg znaków przed jakąkolwiek skonfliktowaną serią znaków i zastępujesz je czymś bezpiecznym do momentu, aż regex zostanie zakończony, a następnie zastąpi je z powrotem? –

0
System.out.println(src.replaceAll("\\/\\*.*?\\*\\/ ?", "")); 

Trzeba używać non-chciwy-kwantyfikator? aby uruchomić działanie regex. Dodałem też "?" na końcu wyrażenia regularnego, aby usunąć jedną spację.

12

najlepiej multiline komentarz regex jest unrolled wersja (?s)/\*.*?\*/ że wygląda

String pat = "/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/"; 

Zobacz /\*[^*]*\*+(?:[^/*][^*]*\*+)*/ regex demo i wyjaśnień w regex101.com.

W skrócie,

  • /\* - dopasować komentarz rozpocząć /*
  • [^*]*\*+ - mecz 0+ znaki inne niż * następnie z 1+ dosłownych *
  • (?:[^/*][^*]*\*+)* - 0+ sekwencji:
    • [^/*][^*]*\*+ - nie jest to / lub * (dopasowane [^/*]), a następnie z 0+ znaków spoza gwiazdką ([^*]*), a następnie z gwiazdkami (1+) \*+
  • / - zamykanie /

David's regex potrzeb 26 kroków wybrać dopasuj w moim przykładowym łańcuchu, a my regex potrzebuje tylko 12 kroków. Przy dużych nakładach, wyrażenie regularne Davida prawdopodobnie zawodzi w przypadku problemu z przepełnieniem stosu lub czegoś podobnego, ponieważ dopasowanie lazy do kropki jest nieefektywne z powodu leniwego rozszerzania wzorca w każdej lokalizacji, w której działa silnik regex, podczas gdy mój wzorzec dopasowuje liniowe fragmenty tekstu za jednym zamachem .

+0

Jak do tego doszło? –

+1

@ AT-Aoi Zasadniczo pochodzi z sekcji * Mastering Wyrażenia regularne *, * Usuwanie komentarzy C *. –

0

Spróbuj tego, który pracował dla mnie:

System.out.println(src.replaceAll("(\/\*.*?\*\/)+",""));