Java字符串分隔方法split实践 2022-04-11 08:43 554阅读 0赞 在工作中,有字符串分隔很自然也一直用String的split方法,但直到今天,我竟然踩到了一个坑。 **一.正常的分隔,分隔符是“:”** package com.bijian.test; import java.util.List; import com.google.common.base.Splitter; public class SplitTest { private static final String SPLIT_CHAR = ":"; public static void main(String[] args) { String str = "21001:03"; splitMethod1(str); splitMethod2(str); } private static void splitMethod1(String str) { String[] strList = str.split(SPLIT_CHAR); String firstStr = strList[0]; String secondStr = strList[1]; System.out.println("firstStr:" + firstStr + ",secondStr:" + secondStr); } private static void splitMethod2(String str) { List<String> strList = Splitter.on(SPLIT_CHAR).splitToList(str); String firstStr = strList.get(0); String secondStr = strList.get(1); System.out.println("firstStr:" + firstStr + ",secondStr:" + secondStr); } } 运行结果: firstStr:21001,secondStr:03 firstStr:21001,secondStr:03 **二.复杂的分隔,分隔符是“:@:”** package com.bijian.test; import java.util.List; import com.google.common.base.Splitter; public class SplitTest { private static final String SPLIT_CHAR = ":@:"; public static void main(String[] args) { String str = "21001:@:03"; splitMethod1(str); splitMethod2(str); } private static void splitMethod1(String str) { String[] strList = str.split(SPLIT_CHAR); String firstStr = strList[0]; String secondStr = strList[1]; System.out.println("firstStr:" + firstStr + ",secondStr:" + secondStr); } private static void splitMethod2(String str) { List<String> strList = Splitter.on(SPLIT_CHAR).splitToList(str); String firstStr = strList.get(0); String secondStr = strList.get(1); System.out.println("firstStr:" + firstStr + ",secondStr:" + secondStr); } } 运行结果: firstStr:21001,secondStr:03 firstStr:21001,secondStr:03 **三.将实例二中的@换成|,即分隔符为“:|:”** package com.bijian.test; import java.util.List; import com.google.common.base.Splitter; public class SplitTest { private static final String SPLIT_CHAR = ":|:"; public static void main(String[] args) { String str = "21001:|:03"; splitMethod1(str); splitMethod2(str); } private static void splitMethod1(String str) { String[] strList = str.split(SPLIT_CHAR); String firstStr = strList[0]; String secondStr = strList[1]; System.out.println("firstStr:" + firstStr + ",secondStr:" + secondStr); } private static void splitMethod2(String str) { List<String> strList = Splitter.on(SPLIT_CHAR).splitToList(str); String firstStr = strList.get(0); String secondStr = strList.get(1); System.out.println("firstStr:" + firstStr + ",secondStr:" + secondStr); } } 运行结果: firstStr:21001,secondStr:| firstStr:21001,secondStr:03 **四.原来是“|”的问题,分隔符仅为“|”测试运行如下** package com.bijian.test; import java.util.List; import com.google.common.base.Splitter; public class SplitTest { private static final String SPLIT_CHAR = "|"; public static void main(String[] args) { String str = "21001|03"; splitMethod1(str); splitMethod2(str); } private static void splitMethod1(String str) { String[] strList = str.split(SPLIT_CHAR); String firstStr = strList[0]; String secondStr = strList[1]; System.out.println("firstStr:" + firstStr + ",secondStr:" + secondStr); } private static void splitMethod2(String str) { List<String> strList = Splitter.on(SPLIT_CHAR).splitToList(str); String firstStr = strList.get(0); String secondStr = strList.get(1); System.out.println("firstStr:" + firstStr + ",secondStr:" + secondStr); } } 运行结果: firstStr:,secondStr:2 firstStr:21001,secondStr:03 **五.案例分析** 使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。 我们看jdk doc中说明 public String[] split(String regex) Splits this string around matches of the given regular expression. 参数regex是一个 regular-expression的匹配模式而不是一个简单的String,他对一些特殊的字符可能会出现你预想不到的结果,比如测试下面的代码: 1.用竖线 | 分隔字符串,你将得不到预期的结果 public static void splitTest02() { String splitChar = "|"; //结果不正确 //String splitChar = "\\|"; String str = "bijian|bi|jian"; String[] strs = str.split(splitChar); System.out.println(strs[0]); System.out.println(strs[1]); System.out.println(strs[2]); } 2.用竖 \* 分隔字符串运行将抛出java.util.regex.PatternSyntaxException异常,用加号 + 也是如此。 public static void splitTest04() { String[] aa = "aaa*bbb*ccc".split("*"); //Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 //String[] aa = "aaa|bbb|ccc".split("\\*"); 这样才能得到正确的结果 for (int i = 0 ; i <aa.length ; i++ ) { System.out.println("--"+aa[i]); } } 显然,+ \* 不是有效的模式匹配规则表达式,用"\\\\\*" "\\\\+"转义后即可得到正确的结果。"|" 分隔串时虽然能够执行,但是却不是预期的目的,"\\\\|"转义后即可得到正确的结果。 如果想在串中使用""字符,则也需要转义。首先要表达"aaaa\\bbbb"这个串就应该用"aaaa\\\\bbbb",如果要分隔就应该这样才能得到正确结果: String[] aa = "aaa\\bbb\\bccc".split("\\\\"); **六.小结** 1.如果用"."作为分隔的话,必须是如下写法:String.split("\\\\."),这样才能正确的分隔开,不能用String.split("."); 2.如果用"|"作为分隔的话,必须是如下写法:String.split("\\\\|"),这样才能正确的分隔开,不能用String.split("|"); "."和"|"都是转义字符,必须得加"\\"; 但实际上这样还是有坑,String 自带的Split 分割字符串类中不会把分割字符串后的空字符串添加到数组当中,String\[\] str = "000|111|222||".split("\\\\|");进行分割后字符串的长度为3,只能得到str\[0\],str\[1\],str\[2\],后面的str\[3\],str\[4\]是不存在的,如果直接访问str\[3\],str\[4\]会发生以下错误:java.lang.ArrayIndexOutOfBoundsException。 3.如果在一个字符串中有多个分隔符,可以用"|"作为连字符,比如:"acount=? and uu =? or n=?",把三个都分隔出来,可以用String.split("and|or"); 4.采用com.google.common.base.Splitter的on方法,如上实例所示。【综合考虑,这种方法很OK】 5.使用org.apache.commons.lang.StringUtils.splitPreserveAllTokens 方法。【综合考虑,这种方法很OK】 6.使用String.split(str, n);指定分隔的次数。【这个测试是OK的,但在具体使用中,很难知道我要分隔的次数】 ![9629552a-0dad-3d00-a2da-896ca0c27251.png][] **附:测试实例** package com.bijian.test; public class SplitTest { public static void main(String[] args) { splitTest05(); } public static void splitTest01() { //String splitChar = "."; //结果不正确 String splitChar = "\\."; String str = "bijian.bi.jian"; String[] strs = str.split(splitChar); System.out.println(strs[0]); System.out.println(strs[1]); System.out.println(strs[2]); } public static void splitTest02() { String splitChar = "|"; //结果不正确 //String splitChar = "\\|"; String str = "bijian|bi|jian"; String[] strs = str.split(splitChar); System.out.println(strs[0]); System.out.println(strs[1]); System.out.println(strs[2]); } public static void splitTest03() { String splitChar = "and|or"; String str = "acount=? and uu =? or n=?"; String[] strs = str.split(splitChar); System.out.println(strs[0]); System.out.println(strs[1]); System.out.println(strs[2]); } public static void splitTest04() { String[] aa = "aaa*bbb*ccc".split("*"); //Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 //String[] aa = "aaa|bbb|ccc".split("\\*"); 这样才能得到正确的结果 for (int i = 0 ; i <aa.length ; i++ ) { System.out.println("--"+aa[i]); } } public static void splitTest05() { String[] aa = "aaa\\bbb\\bccc".split("\\\\"); for (int i = 0 ; i <aa.length ; i++ ) { System.out.println(aa[i]); } } } [9629552a-0dad-3d00-a2da-896ca0c27251.png]: /images/20220411/25f7b7a841fe4491aa4ddaac31d41854.png
相关 Java中实现使用split方法分隔字符串 场景 字符串为: "[CAB1DM1152CJ@2097812420006@20181010,CAB1DM1152CJ@2097812420007@20181010,C 喜欢ヅ旅行/ 2023年10月18日 16:51/ 0 赞/ 28 阅读
相关 C#中使用Split分隔字符串的技巧 [C\中使用Split分隔字符串的技巧][C_Split] 在分割字符串的时候我们常常会用到Split,下面我们就来学习一下分割字符串的技巧和方法。 1、使用String. 忘是亡心i/ 2022年07月12日 11:54/ 0 赞/ 253 阅读
相关 C#中使用Split分隔字符串的技巧 [C\中使用Split分隔字符串的技巧][C_Split] 在分割字符串的时候我们常常会用到Split,下面我们就来学习一下分割字符串的技巧和方法。 1、使用String. 心已赠人/ 2022年07月12日 11:54/ 0 赞/ 174 阅读
相关 字符串分隔 java 字符串分隔 题目描述 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。 输入描 比眉伴天荒/ 2022年05月12日 07:58/ 0 赞/ 237 阅读
相关 Java字符串split方法的小陷阱 今天在写一个Java字符串切分程序时,发现切分后的计数一直有问题,调了半天才找到原因。。。 下面先来看一个问题:有字符串str=“string split test” ,使用 梦里梦外;/ 2022年05月12日 00:54/ 0 赞/ 484 阅读
相关 Java字符串split方法的坑 先来看几行简单的Java代码,如下: System.out.println("1,2".split(",").length); System.out.prin r囧r小猫/ 2022年04月23日 04:54/ 0 赞/ 474 阅读
相关 Java字符串分隔方法split实践 在工作中,有字符串分隔很自然也一直用String的split方法,但直到今天,我竟然踩到了一个坑。 一.正常的分隔,分隔符是“:” package 末蓝、/ 2022年04月11日 08:43/ 0 赞/ 555 阅读
相关 String中split()方法使用特殊符号分隔 圆括号( :split("\[(\]") \符号:split("\\\\\") 斜杆(\\):split("\\\\\\\\") 按位或符号(|):split("\\\\ 一时失言乱红尘/ 2022年01月31日 20:45/ 0 赞/ 322 阅读
相关 【Java】字符串分隔 题目描述 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。 输入描述: 连续输 亦凉/ 2022年01月27日 13:41/ 0 赞/ 327 阅读
相关 Java 利用 split 方法切割字符串 之前经常遇到切割字符串的情况,这里把常见的场景总结一下: 1 // 以空格切割 2 String s1 = "dew q 朴灿烈づ我的快乐病毒、/ 2021年12月03日 23:17/ 0 赞/ 644 阅读
还没有评论,来说两句吧...