【问题标题】:java.util.regex.PatternSyntaxException: Dangling meta character '+' for the string +91java.util.regex.PatternSyntaxException:字符串 +91 的悬挂元字符“+”
【发布时间】:2018-07-19 08:38:57
【问题描述】:

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

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    这可以通过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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-29
      • 2017-03-07
      • 1970-01-01
      • 2013-05-30
      • 2021-05-28
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      相关资源
      最近更新 更多