更新时间:2020-11-02 17:48:18 来源:极悦 浏览1041次
说到 Java 字符串拆分,我们可能会不假思索“这有什么难的,直接上 String 类的 split() 方法不就行了!”假如你真的这么觉得,那可要真的是大错特错了。其中缘由,且听我细细道来。
假如现在有这样一串字符“hello world,一个有趣的程序”,需要按照中文的逗号“,”进行拆分,这意味着第一串字符为逗号前面的“hello world”,第二串字符为逗号后面的“一个有趣的程序”。另外,在拆分之前,要先进行检查,判断一下这串字符是否包含逗号,否则应该抛出异常。
public class Test {
public static void main(String[] args) {
String cmower = "hello world,一个有趣的程序";
if (cmower.contains(",")) {
String [] parts = cmower.split(",");
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
} else {
throw new IllegalArgumentException("当前字符串没有包含逗号");
}
}
}
这段代码看起来挺严谨的,对吧?程序输出的结果完全符合预期:
第一部分:hello world 第二部分:一个趣的程序员
这是建立在字符串是确定的情况下,最重要的是分隔符是确定的。否则,麻烦就来了。
大约有 12 种英文特殊符号,如果直接拿这些特殊符号替换上面代码中的分隔符(中文逗号),这段程序在运行的时候就会出现以下提到的错误。
反斜杠 \(ArrayIndexOutOfBoundsException)
插入符号 ^(同上)
美元符号 $(同上)
逗点 .(同上)
竖线 |(正常,没有出错)
问号 ?(PatternSyntaxException)
星号 *(同上)
加号 +(同上)
左小括号或者右小括号 ()(同上)
左方括号或者右方括号 [](同上)
左大括号或者右大括号 {}(同上)
看到这,可能有小伙伴会说,“这不是钻牛角尖嘛”,不不不,做技术就应该秉持严谨的态度,否则,很容易出现致命的错误。
那遇到特殊符号该怎么办呢?上正则表达式呗。
正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。
解决了心病之后,我们来用英文逗点“.”来替换一下分隔符:
String cmower = "hello world,一个有趣的程序";
if (cmower.contains(".")) {
String [] parts = cmower.split("\\.");
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}
在使用 split() 方法的时候,就需要使用正则表达式 \\. 来替代特殊字符英文逗点“.”了。为什么用两个反斜杠呢?因为它本身就是一个特殊字符,需要先转义。
也可以使用字符类 [] 来包含英文逗点“.”,它也是一个正则表达式,用来匹配方括号中包含的任意字符。
cmower.split("[.]");
除此之外, 还可以使用 Pattern 类的 quote() 方法来包裹英文逗点“.”,该方法会返回一个使用 \Q\E 包裹的字符串。
此时,String.split() 方法的使用示例如下所示:
String [] parts = cmower.split(Pattern.quote("."));
当通过调试模式进入 String.split() 方法源码的话,会发现以下细节:
return Pattern.compile(regex).split(this, limit);
String 类的 split() 方法调用了 Pattern 类的 split() 方法。也就意味着,我们字符串拆分有了新的选择,可以不使用 String 类的 split() 方法了。
public class TestPatternSplit {
/**
* 使用预编译功能,提高效率
*/
private static Pattern twopart = Pattern.compile("\\.");
public static void main(String[] args) {
String [] parts = twopart.split("hello world.一个有趣的程序");
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}
}
除此之外,还可以使用 Pattern 配合 Matcher 类进行字符串拆分,这样做的好处是可以对要拆分的字符串进行一些严格的限制。
由于模式是确定的,所以可以把 Pattern 表达式放在 main() 方法外面,通过 static 的预编译功能提高程序的效率。
不过,使用 Matcher 来匹配一些简单的字符串时相对比较沉重一些,使用 String 类的 split() 仍然是首选,因为该方法还有其他一些牛逼的功能。
比如说,你想把分隔符包裹在拆分后的字符串的第一部分,可以这样做:
String cmower = "hello world,一个有趣的程序";
if (cmower.contains(",")) {
String [] parts = cmower.split("(?<=,)");
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}
程序输出的结果如下所示:
第一部分:hello world, 第二部分:一个有趣的程序
可以看到分隔符“,”包裹在了第一部分,如果希望包裹在第二部分,可以这样做:
String [] parts = cmower.split("(?=,)");
可能有些小伙伴很好奇,?<= 和 ?= 是什么东东啊?它其实是正则表达式中的断言模式。
另外,假如说字符串中包含了多个分隔符,而我们只需要 2 个的话,还可以这样做:
String cmower = "hello world,一个有趣的程序,收藏";
if (cmower.contains(",")) {
String [] parts = cmower.split(",", 2);
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}
split() 方法可以传递 2 个参数,第一个为分隔符,第二个为拆分的字符串个数。查看该方法源码的话,你就可以看到以下内容:
直接 substring() 到原字符串的末尾,也就是说,第二个分隔符处不再拆分。然后就 break 出循环了。来看一下程序输出的结果:
第一部分:hello world 第二部分:一个有趣的程序,收藏
好了以上就是Java字符串拆分的实例讲解,感兴趣的小伙伴可以动动自己的小手,在电脑上敲出代码实际运行一番。也可以观看本站的Java基础教程,学习更多的字符串操作。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习