Подтвердить что ты не робот

Проблема совпадения шаблонов строк в 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)

Есть ли какая-то причина? Как мы можем избежать этого?

4b9b3361

Ответ 1

Первый аргумент string.replaceAll - это регулярное выражение, а не только строка. Открывающая левая скобка является специальным символом в регулярном выражении, поэтому вы должны избегать ее:

line.replaceAll("\\(", "_");

В качестве альтернативы, поскольку вы заменяете один символ, вы можете использовать string.replace следующим образом:

line.replace('(', '_');

Ответ 2

Сообщение об ошибке над трассировкой стека (несколько) полезно:

Исключение в потоке "main" java.util.regex.PatternSyntaxException: Незакрытая группа вблизи индекса 1     (      ^

(Это то, что я получаю на Java 6.) В нем упоминаются "регулярное выражение", "группа" и круглые скобки. Если вы не видите это сообщение, вы должны проверить, как вы регистрируете/ловите/отображаете исключения. Это может сэкономить вам некоторую проблему в будущем.