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("/**", "");
*
это специальный символ регулярного выражения, который соответствует любому количеству любых символов в зависимости от контекста, в котором вы удаляете комментарии, которые хотите сопоставить с литералом*
так что вам нужно ваше регулярное выражение, чтобы быть/\*\*
,- Поскольку это регулярное выражение находится внутри строки Java, оно будет пытаться прочитать
\*
как код выхода (как\n
будучи символом новой строки), но\*
не один Это должно быть\\*
вместо этого значение String должно быть/\\*\\*
Это правильно.
comment = comment.replaceAll("/\\*\\*", "");
В сторону, даже если \*
был допустимым escape-кодом, то, чем он был заменен, будет передан в регулярное выражение, а не \*
, (например, если вы положите \n
в символе новой строки вводится регулярное выражение, а не обратная косая черта и строчные буквы n.
Вы можете пойти с чем-то вроде этого, хотя
comment = comment.replaceAll("/\\**\\*/", "");
который будет удалять /* <stuff> */
, Это ловит комментарии к документу и регулярные многострочные комментарии в дополнение к удалению всего комментария. Это зависит от того, как вы прочитали строку.