Вопрос-ответ

Regex to match a C-style multiline comment

Регулярное выражение для сопоставления многострочного комментария в стиле C

У меня есть строка для, например

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

Я хочу удалить /* this is comment *\*/ и /** this is another comment */ подстроки из src строки.

Я пытался использовать регулярное выражение, но потерпел неудачу из-за меньшего опыта.

Переведено автоматически
Ответ 1

Лучшее регулярное выражение для многострочного комментария - это развернутая версия (?s)/\*.*?\*/, которая выглядит как

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

Смотрите демонстрацию регулярных выражений и объяснение по ссылке regex101.com .

Вкратце,


  • /\* - сопоставьте начало комментария /*

  • [^*]*\*+ - сопоставьте 0+ символов, отличных от *, за которыми следует 1+ литерал *

  • (?:[^/*][^*]*\*+)* - 0+ последовательностей:

    • [^/*][^*]*\*+ - не a / или * (сопоставляется с [^/*]), за которым следует 0+ символов без звездочек ([^*]*), за которыми следует 1+ звездочек (\*+)



  • / - закрытие /

Регулярному выражению Дэвида требуется 26 шагов, чтобы найти соответствие в строке моего примера, а моему регулярному выражению требуется всего 12 шагов. При огромных входных данных регулярное выражение Дэвида, скорее всего, завершится ошибкой из-за проблемы с переполнением стека или чего-то подобного, потому что .*? ленивое сопоставление точек неэффективно из-за ленивого расширения шаблона в каждом месте, которое выполняет движок регулярных выражений, в то время как мой шаблон сопоставляет линейные фрагменты текста за один раз.

Ответ 2

Попробуйте использовать это регулярное выражение (только однострочные комментарии):

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

Объяснено РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ:


Буквальное сопоставление символа "/"


Буквальное сопоставление символа "*"


"." Сопоставьте любой одиночный символ


"*?" От нуля до неограниченного количества раз, как можно меньше, расширяясь по мере необходимости (лениво)


Буквальное сопоставление символа "*"


Буквальное сопоставление символа "/"


В качестве альтернативы можно использовать регулярное выражение для однострочных и многострочных комментариев, добавив (?ы):

//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);

Ссылка:

Ответ 3

Попробуйте это:

(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)

Если вы хотите исключить части, заключенные в " "
затем используйте:

(\"[^\"]*\"(?!\\))|(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)

первая группа захвата идентифицирует все " " части, а вторая группа захвата предоставляет комментарии (как однострочные, так и многострочные)

скопируйте регулярное выражение в regex101, если вам нужно объяснение

Ответ 4
(?s)(?i)(^|\s+?)(\/\*)((.)(?!\*\/))*?(this)(.*?)(\*\/)

Вы можете найти слова внутреннего комментария:

2023-07-06 14:34 java regex string