Программа выдает ошибку при применении метода replaceFirst
Почему этот код вызывает ошибку?
String word = "( h";
String text = word.replaceFirst("(", "");
А если написать вот так, то ошибки не будет:
String word = "( h";
String text = word.replace("(", "")
Почему replaceFirst так реагирует на скобку и выдает вот такую ошибку?
Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing ')'
)
at java.util.regex.Pattern.error(Pattern.java:1969)
at java.util.regex.Pattern.compile(Pattern.java:1706)
at java.util.regex.Pattern.<init>(Pattern.java:1352)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at java.lang.String.replaceFirst(String.java:2178)
at com.company.Main.encode(Main.java:20)
at com.company.Main.main(Main.java:11)
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Есть возможность как-то обойти эту проблему, используя цикл?
Для экранирования всех символов в строке, которая используется в качестве регулярного выражения, существует метод Pattern::quote, который превращает входную строку в строковый литерал.
Если входная строка гарантированно не содержит последовательности в виде:
\Q- начало экранирования\E- конец экранирования, то грубая реализация подобного метода может выглядеть так:
public static String quoteRegex(String literal) {
return "\\Q" + literal + "\\E";
}
Таким образом, код для замены будет выглядеть так:
String word = "( h";
for (String elem:word.split("")) {
text = word.replaceFirst(Pattern.quote(elem), "");
// ...
}