Проблема сопоставления с образцом строки в Java - PullRequest
20 голосов
/ 09 января 2010

В моей программе, когда я использую

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)

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

Ответы [ 2 ]

37 голосов
/ 09 января 2010

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

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

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

line.replace('(', '_');
2 голосов
/ 09 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...