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"));
这样就完美解决问题。
网友评论