我正在使用下面的正则表达式字符串将提供的字符串替换为****
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)
如何解决上述异常?
答案 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