Java replaceAll - заменить "/**" на ""

В настоящее время я делаю анализ комментариев с помощью некоторого кода Java, и мне нужно было выполнить следующую операцию:

comment = comment.replaceAll("/**", "");

Но я встречаюсь с этим исключением:

    Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 2
/**
  ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.replaceAll(Unknown Source)
    at commentCoupler.coupler.commentCriteriaForfilled(coupler.java:234)
    at commentCoupler.coupler.analyze(coupler.java:64)
    at commentCoupler.coupler.recursiveCoupler(coupler.java:27)
    at commentCoupler.coupler.recursiveCoupler(coupler.java:22)
    at commentCoupler.coupler.recursiveCoupler(coupler.java:22)
    at commentCoupler.main.main(main.java:16)

Изменить: исключение также происходит, когда я делаю

comment = comment.replaceAll("**/", "");

а также

comment = comment.replaceAll("*/", "");

Кто-нибудь знает, почему это происходит, и у кого-нибудь есть обходной путь?

4 ответа

Решение

replaceAll принимает регулярное выражение, и /** недопустимое регулярное выражение.

Если вы просто хотите удалить /** использовать replace вместо.

Первый параметр replaceAll является регулярным выражением, а символ "*" имеет особое значение в регулярных выражениях.

Вы можете использовать что-то вроде этого:

String a = "/**hola mundo/**, adios mundo";
String output = a.replaceAll("/\\*\\*", "");
System.out.println(output); // --> "hola mundo, adios mundo"

Две вещи не так с этим кодом:

comment = comment.replaceAll("/**", "");
  1. * это специальный символ регулярного выражения, который соответствует любому количеству любых символов в зависимости от контекста, в котором вы удаляете комментарии, которые хотите сопоставить с литералом * так что вам нужно ваше регулярное выражение, чтобы быть /\*\*,
  2. Поскольку это регулярное выражение находится внутри строки Java, оно будет пытаться прочитать \* как код выхода (как \n будучи символом новой строки), но \* не один Это должно быть \\* вместо этого значение String должно быть /\\*\\*

Это правильно.

comment = comment.replaceAll("/\\*\\*", "");

В сторону, даже если \* был допустимым escape-кодом, то, чем он был заменен, будет передан в регулярное выражение, а не \*, (например, если вы положите \n в символе новой строки вводится регулярное выражение, а не обратная косая черта и строчные буквы n.


Вы можете пойти с чем-то вроде этого, хотя

comment = comment.replaceAll("/\\**\\*/", "");

который будет удалять /* <stuff> */, Это ловит комментарии к документу и регулярные многострочные комментарии в дополнение к удалению всего комментария. Это зависит от того, как вы прочитали строку.

comment = comment.replaceAll("/\**", "");
Другие вопросы по тегам