[^*]*\*+ - сопоставьте 0+ символов, отличных от *, за которыми следует 1+ литерал *
(?:[^/*][^*]*\*+)* - 0+ последовательностей:
[^/*][^*]*\*+ - не a / или * (сопоставляется с [^/*]), за которым следует 0+ символов без звездочек ([^*]*), за которыми следует 1+ звездочек (\*+)
/ - закрытие /
Регулярному выражению Дэвида требуется 26 шагов, чтобы найти соответствие в строке моего примера, а моему регулярному выражению требуется всего 12 шагов. При огромных входных данных регулярное выражение Дэвида, скорее всего, завершится ошибкой из-за проблемы с переполнением стека или чего-то подобного, потому что .*? ленивое сопоставление точек неэффективно из-за ленивого расширения шаблона в каждом месте, которое выполняет движок регулярных выражений, в то время как мой шаблон сопоставляет линейные фрагменты текста за один раз.
Ответ 2
Попробуйте использовать это регулярное выражение (только однострочные комментарии):
Stringsrc="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);
Объяснено РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ:
Буквальное сопоставление символа "/"
Буквальное сопоставление символа "*"
"." Сопоставьте любой одиночный символ
"*?" От нуля до неограниченного количества раз, как можно меньше, расширяясь по мере необходимости (лениво)
Буквальное сопоставление символа "*"
Буквальное сопоставление символа "/"
В качестве альтернативы можно использовать регулярное выражение для однострочных и многострочных комментариев, добавив (?ы):
//note the added \n which wont work with previous regex Stringsrc="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);