Java Regex模式语法异常

时间:2012-04-03 00:32:58

标签: java regex stringbuilder

我遇到了Java Regex Pattern Syntax表达式的问题。

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

我收到以下错误:

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

不知道如何修复....如果需要会提供更多代码

3 个答案:

答案 0 :(得分:2)

这段代码很乱。尝试使用变量将其拆分为更易于管理的块。

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

这将使代码更具可读性并可能揭示您的错误。

答案 1 :(得分:0)

你想在你的正则表达式中匹配什么?

你现在的正则表达式是“匹配0或1个不敏感的情况”,你不是说要匹配什么。这是一个字吗?一个号码?

此外,您的代码可以进行一些简化,但我们首先处理正则表达式,因为这就是问题所在。

2行代码将执行此操作(基于pastebin中的现有参数和常量):

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

答案 2 :(得分:0)

我没有立即看到您的正则表达式代码有什么问题,但我怀疑如果我们知道toCensorword的值,问题会很明显。我按如下方式重写了你的代码:

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()。您还可以通过更好地检查输入来确保它们是完整的单词来解决此问题。我怀疑)不适合被审查。