Я не сразу вижу, что не так с вашим кодом регулярного выражения, хотя я подозреваю, что проблема была бы очевидна, если бы мы знали значения для toCensor
и word
. Я переписал ваш код следующим образом:
String toCensor = "some sentence that uses frack word";
String word = "frack";
String replaceWith = "f#@!ck";
String regex = new StringBuilder("(?i)").append(word).toString();
toCensor = toCensor.replaceAll(regex, replaceWith);
Итак, вы пытаетесь запустить регулярное выражение для toCentor
и выполнить поиск без учета регистра (это флаг (?i)
), ища слово. Одна проблема состоит в том, что если word
имеет какие-либо специальные символы регулярного выражения, они будут рассматриваться как часть шаблона. Я думаю, что это ваша ошибка. Например, если вы попробуете это:
String word = ")ick";
Вы получите ошибку:
Unmatched closing ')' near index 4 (?i))ick
Это похоже, но не совсем то, что вы видите. Вы можете отключить компиляцию шаблонов регулярных выражений, поместив слово в `" \ Qword \ E ". Например:
String regex = new StringBuilder("(?i)\\Q").append(word).append("\\E").toString();
toCensor = toCensor.replaceAll(regex, replace);
'\ Q' в шаблоне включает "цитирование", а \E
это конец. Смотрите также Pattern.quote()
. Вы также можете исправить это, выполнив лучшую проверку правильности ввода, чтобы убедиться, что они являются целыми словами. Я подозреваю, что )
не подходит для цензуры.