PatternSyntaxException при вызове replaceAll()

308
25 декабря 2016, 19:41

Есть участок кода:

String[] del = {"\"", "\'", ",", ".", ";", "`", ":", "!", "(", ")", "<", ">", "-", "_"};
for (String delElement : del) {
    word = word.replaceAll(delElement, "");
}

При компиляции выкидывает исключение PatternSyntaxException:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 1
(
 ^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.accept(Pattern.java:1813)
at java.util.regex.Pattern.group0(Pattern.java:2908)
at java.util.regex.Pattern.sequence(Pattern.java:2051)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.compile(Pattern.java:1696)
at java.util.regex.Pattern.<init>(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at java.lang.String.replaceAll(String.java:2223)
at WordCounter.main(WordCounter.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Как можно исправить?

Answer 1

Так как первым аргументом метод replaceAll принимает регулярное выражение, то ( воспринимается как спец. символ (как начало группы и т.д.). Поэтому его нужно экранировать. То же самое касается ). А ещё . в регулярных выражениях обозначает любой символ, поэтому .replaceAll(".", "") приводит к пустой строке в качестве результата.

String[] del = { "\"", "\'", ",", "\\.", ";", "`", ":", "!", "\\(", "\\)", "<", ">", "-", "_" };
String word = "abc\"',.;`:!()<>-_def";
for (String delElement : del)
{
    word = word.replaceAll(delElement, "");
}
System.out.println(word);

Так как используется рег. выражение, то можно все элементы для исключения объединить в одно выражение, дабы делать всего один replaceAll. Однако читабельностью такой вариант не особо отличается:

String del = "[\"',\\.;`:!\\(\\)<>\\-_]";
String word = "abc\"',.;`:!()<>-_def";
word = word.replaceAll(del, "");
System.out.println(word);
Answer 2

Попробуйте так:

String[] del = {"\"", "\'", ",", ".", ";", "`", ":", "!", "(", ")", "<", ">", "-", "_"};
for (String delElement : del) 
        word = word.replaceAll(Pattern.quote(delElement), "");
READ ALSO
Многострочный вывод ячейки в JTable

Многострочный вывод ячейки в JTable

Здравствуйте, столкнулся с проблемой, что никак не могу заставить исходниками из интернета, которые, как говорят их авторы "работают", заставить...

363
Не срабатывает getView и другие странности Android Studio

Не срабатывает getView и другие странности Android Studio

ЗдравствуйтеИмеются классы унаследованные от Fragment и реализующие интерфейс CursorLoader

334
Ожидание нажатия кнопки

Ожидание нажатия кнопки

Как сделать, чтобы запущенный метод ждал нажатие кнопки?

796
Внедрение в контекстное меню android телефона

Внедрение в контекстное меню android телефона

Здравствуйте, подскажите пожалуйста есть ли возможность внедрить в меню "Копировать вставить" свой пункт? При нажатие на который мы бы переходили...

364