Java正则表达式模式语法异常
我在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 不知道
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);