java.util.regex.PatternSyntaxException: 悬空元字符 '+' 表示字符串 +91



我使用下面的正则表达式字符串将提供的字符串替换为***

String output=output.replaceAll("(?<!\w)(?i)"+requesterView.getFirstname()+"(?!\w)","****");

提供的字符串+91上方

如果它包含+,则得到异常以下

java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 12
(?<!w)(?i)(+91)(?!w)
^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.sequence(Pattern.java:2123)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.group0(Pattern.java:2905)
at java.util.regex.Pattern.sequence(Pattern.java:2051)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.compile(Pattern.java:1696)
at java.util.regex.Pattern.<init>(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)

如何解决上述异常?

您需要对输入字符串中的regex元字符进行转义,可以使用Pattern.quote(String str)静态方法:

String output=output.replaceAll("(?<!\w)(?i)"+Pattern.quote(requesterView.getFirstname())+"(?!\w)","****");

目前,Java试图将输入字符串(+91)的标记解析为regex标记,但无法在上下文中理解+元字符。此外,括号会被理解为捕获组。

就像Aaron提到的那样,您需要引用正则表达式。

这既可以用Pattern.quote实现,也可以与E一起使用Q。这里有一个例子:

public static String transformRegex(String input, String testStr) {
return input.replaceAll("(?<!\w)(?i)\Q" + testStr + "\E(?!\w)", "****");
}

以下是对上述方法的测试:

String output = transformRegex("+91 123123123", "+91");
System.out.println(output);

此打印:

**** 123123123