Исключение синтаксиса шаблона Java Regex - PullRequest
0 голосов
/ 03 апреля 2012

У меня проблемы с выражением синтаксиса шаблона регулярных выражений Java.

toCensor = toCensor.replaceAll((new 
   StringBuilder(("(?i)"))).append(word).toString(),
   String.copyValueOf(replace));

Я получаю следующую ошибку:

java.util.regex.PatternSyntaxException: Unmatched closing ')' 
   near index 4 (?i)!ick

не знаю, как исправить .... даст больше кода при необходимости

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Этот код беспорядок. Попробуйте разбить его на более управляемые куски с помощью переменных.

StringBuilding regex = ....;
String replaceResult = toCensor.replaceAll(regex);
String appendResult = replaceResult.append(word);
...

Это сделает код более читабельным и, возможно, покажет вашу ошибку.

0 голосов
/ 03 апреля 2012

Я не сразу вижу, что не так с вашим кодом регулярного выражения, хотя я подозреваю, что проблема была бы очевидна, если бы мы знали значения для 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(). Вы также можете исправить это, выполнив лучшую проверку правильности ввода, чтобы убедиться, что они являются целыми словами. Я подозреваю, что ) не подходит для цензуры.

0 голосов
/ 03 апреля 2012

Что вы пытаетесь найти в своем регулярном выражении?

Ваше текущее регулярное выражение говорит "совпадать с 0 или 1 регистром без учета", вы не говорите, что сопоставлять. Это слово? Число?

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

2 строки кода сделают это (на основе существующих параметров и констант в pastebin):

String regex = "(" + StringUtils.join(BADWORDS, "|") + ")";
String result = toCensor.replaceAll(regex, "*");
...