Проблема совпадения шаблонов строк в Java
В моей программе, когда я использую
line.replaceAll("(", "_");
Я получил RuntimeException
:
at java.util.regex.Pattern.error(Unknown Source)
at java.util.regex.Pattern.accept(Unknown Source)
at java.util.regex.Pattern.group0(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 Processing.processEarly(Processing.java:95)
at Processing.main(Processing.java:34)
Есть ли какая-то причина? Как мы можем избежать этого?
Ответы
Ответ 1
Первый аргумент string.replaceAll
- это регулярное выражение, а не только строка. Открывающая левая скобка является специальным символом в регулярном выражении, поэтому вы должны избегать ее:
line.replaceAll("\\(", "_");
В качестве альтернативы, поскольку вы заменяете один символ, вы можете использовать string.replace
следующим образом:
line.replace('(', '_');
Ответ 2
Сообщение об ошибке над трассировкой стека (несколько) полезно:
Исключение в потоке "main" java.util.regex.PatternSyntaxException: Незакрытая группа вблизи индекса 1 ( ^
(Это то, что я получаю на Java 6.) В нем упоминаются "регулярное выражение", "группа" и круглые скобки. Если вы не видите это сообщение, вы должны проверить, как вы регистрируете/ловите/отображаете исключения. Это может сэкономить вам некоторую проблему в будущем.