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("(\/\*.*?\*\/)+",""));