美文网首页踩过的坑
java.util.regex.patternsyntaxexc

java.util.regex.patternsyntaxexc

作者: SuperCrab | 来源:发表于2018-08-01 15:40 被阅读0次

    1.状况

            一次生产填坑,线上版本出现一个问题,当用户在邮箱中输入“+”号时出现crash,当地一个字符是“+"crash,“+”放在中间不会崩溃,但是String.split不起作用。但是用"."、"-"、"_"、"="时候却没有之类问题.经测试除了"+","?"、"*"也存在此问题

        String temp= "12345+6-78@qq.com";

        String[] a= temp.split("+6"); \\编译报错

        String[] b= temp.split("5+6");    \\打印length为1

        需要截取中间的"+6",但是存在可能不存在+,或者截取的不只是"+6"

        直接运行上述代码

    Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0+^at java.util.regex.Pattern.error(Pattern.java:1957)at java.util.regex.Pattern.sequence(Pattern.java:2125)at java.util.regex.Pattern.expr(Pattern.java:1998)at java.util.regex.Pattern.compile(Pattern.java:1698)at java.util.regex.Pattern.(Pattern.java:1351)

    at java.util.regex.Pattern.compile(Pattern.java:1028)

    at java.lang.String.split(String.java:2380)

    at java.lang.String.split(String.java:2422)

    at com.crab.design.patterns.test.main(test.java:26)

        出错是因为第一行导致的,第二行不会出错,但是分割结果只有一行。

    2.解决方案

        方案一:只需要截取"+",并且固定

        当只需要截取特殊字符"+",可以直接对字符转义

        String temp= "12345+6-78@qq.com";

        String[] a= temp.split("\\+6");

         String[] b= temp.split("5\\+6");

        但是如果现在我需要动态截取,"+"位置不固定,这种就无法实现,那么久需要第二种方案

        方案二:动态转义

        新建一个方法对特殊字符进行处理

        public static String transStrigForSplit(String s) {

                if (s.contains("+")) {

                    s = s.replace("+", "[+]");

                }

                return s;

        }

    String[] a= temp.split(transStrigForSplit("+6"));

    String[] b= temp.split(transStrigForSplit("5+6"));

    这样就完美解决问题。

    相关文章

      网友评论

        本文标题:java.util.regex.patternsyntaxexc

        本文链接:https://www.haomeiwen.com/subject/sgkrvftx.html