Программа выдает ошибку при применении метода 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), "");
    // ...
}
→ Ссылка