java.util.regex.PatternSyntaxException:字符串+91的悬挂元字符'+'

时间:2018-07-19 08:38:58

标签: regex

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

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)

如何解决上述异常?

2 个答案:

答案 0 :(得分:1)

您需要在输入字符串中转义正则表达式元字符,可以使用Pattern.quote(String str)静态方法:

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

当前,Java尝试将输入字符串(+91)的标记解析为正则表达式标记,并且在发现的上下文中无法理解+元字符。此外,括号应为被理解为捕获组织。

答案 1 :(得分:1)

像亚伦一样,您需要引用正则表达式。

这可以通过Pattern.quote\Q\E一起实现。这是一个示例:

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