Java正则表达式模式语法异常

Java正则表达式模式语法异常,java,regex,stringbuilder,Java,Regex,Stringbuilder,我在Java正则表达式模式语法表达式方面遇到问题 toCensor = toCensor.replaceAll((new StringBuilder(("(?i)"))).append(word).toString(), String.copyValueOf(replace)); 我得到以下错误: java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 4 (?i)!ick 不知道

我在Java正则表达式模式语法表达式方面遇到问题

toCensor = toCensor.replaceAll((new 
   StringBuilder(("(?i)"))).append(word).toString(),
   String.copyValueOf(replace));
我得到以下错误:

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

不知道如何修复。。。。如果需要,将提供更多代码

此代码乱七八糟。尝试使用变量将其拆分为更易于管理的块

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

这将使代码更具可读性,可能会暴露您的错误。

您想在正则表达式中匹配什么

您当前的正则表达式说“不敏感地匹配0或1个case”,您并没有说要匹配什么。这是一个词吗?一个号码

您的代码也可以做一些简化,但让我们先处理正则表达式,因为这就是问题所在

2行代码即可(基于pastebin中的现有参数和常量):


虽然我怀疑如果我们知道
tosensor
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。一个问题是,如果
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”打开“quoting”,并且
\E
是它的结尾。另见。您还可以通过对输入进行更好的健全性检查来解决这个问题,以确保它们是完整的单词。我怀疑
不是要审查的适当字符。

索引4(?I)“附近的“不匹配结束”)的哪一部分很难理解?对不起。问题是,我找到了一些用于审查的代码,我正在尝试处理它,但我以前从未使用过正则表达式。如果你愿意,我可以把密码寄出去。甚至不知道修复后是否能工作。正则表达式([a-z]?i)将匹配0或1个字符a-z或a-z。您缺少匹配条件。那么你想做什么?@owlstead:我认为OP的字面意思是“审查”;代码用于用指定的替换字符串替换指定的单词,我认为指定的单词实际上应该被“审查”。(如果所有审查人员都这么直截了当的话!)添加以下代码片段以删除需要转义的字符:tosensor=tosensor.replaceAll(“[a-zA-Z-0-9]”,”);
String regex = new StringBuilder("(?i)\\Q").append(word).append("\\E").toString();
toCensor = toCensor.replaceAll(regex, replace);