Regex соответствует многострочному комментарию в стиле 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

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

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 объяснил:

Совпадение символа "/" буквально

Подбирайте буквально символ "*"

"" Подберите любой отдельный символ

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

Подбирайте буквально символ "*"

Совпадение символа "/" буквально

В качестве альтернативы здесь можно использовать регулярные выражения для однострочных и многострочных комментариев, добавив (? 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);

Ссылка:

Ответ 2

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

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

Смотрите демонстрацию и объяснение regex на regex101.com.

Короче,

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

David regex нужно 26 шагов, чтобы найти совпадение в моем примере строки, а [my regex] [2] нужно всего 12 шагов. С огромными входными данными David regex, вероятно, потерпит неудачу из-за проблемы или чего-то подобного, потому что .*? Ленивое сопоставление точек неэффективно из-за ленивого расширения шаблона в каждом месте, которое выполняет механизм регулярных выражений, в то время как мой шаблон сопоставляет линейные фрагменты текста за один раз.

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Вам нужно использовать не-жадный квантификатор? чтобы заставить регулярное выражение работать. Я также добавил '?' в конце регулярного выражения, чтобы удалить одно пространство.

Ответ 5

Попробуйте это, который работал для меня:

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