我使用下面的正则表达式字符串将提供的字符串替换为***
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