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("沉默王二.一枚有趣的程序员"); System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]); } }
除此之外,还可以使用 Pattern 配合 Matcher 类进行字符串拆分,这样做的好处是可以对要拆分的字符串进行一些严格的限制,来看一段示例代码:
public class TestPatternMatch { /** * 使用预编译功能,提高效率 */ private static Pattern twopart = Pattern.compile("(.+)\\.(.+)"); public static void main(String[] args) { checkString("沉默王二.一枚有趣的程序员"); checkString("沉默王二."); checkString(".一枚有趣的程序员"); } private static void checkString(String str) { Matcher m = twopart.matcher(str); if (m.matches()) { System.out.println("第一部分:" + m.group(1) + " 第二部分:" + m.group(2)); } else { System.out.println("不匹配"); } } }
这时候,正则表达式为 (.+)\\.(.+),意味着可以把字符串按照英文逗点拆分成一个字符组,英文小括号 () 的作用就在于此(可以查看我之前提供的正则表达式手册)。
由于模式是确定的,所以可以把 Pattern 表达式放在 main() 方法外面,通过 static 的预编译功能提高程序的效率。
来看一下程序的输出结果:
第一部分:沉默王二 第二部分:一枚有趣的程序员
不匹配
不匹配
不过,使用 Matcher 来匹配一些简单的字符串时相对比较沉重一些,使用 String 类的 split() 仍然是首选,因为该方法还有其他一些牛逼的功能。
比如说,你想把分隔符包裹在拆分后的字符串的第一部分,可以这样做:
String cmower = "沉默王二,一枚有趣的程序员"; if (cmower.contains(",")) { String [] parts = cmower.split("(?<=,)"); System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]); }
程序输出的结果如下所示:
第一部分:沉默王二, 第二部分:一枚有趣的程序员
1
可以看到分隔符“,”包裹在了第一部分,如果希望包裹在第二部分,可以这样做:
String [] parts = cmower.split("(?=,)");
1
可能有些小伙伴很好奇,?<= 和 ?= 是什么东东啊?它其实是正则表达式中的断言模式。
温馨提醒:如果对断言模式比较生疏的话,可以查看我之前提供的正则表达式手册。
另外,假如说字符串中包含了多个分隔符,而我们只需要 2 个的话,还可以这样做:
String cmower = "沉默王二,一枚有趣的程序员,宠爱他";
if (cmower.contains(",")) {
String [] parts = cmower.split(",", 2);
System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}
split() 方法可以传递 2 个参数,第一个为分隔符,第二个为拆分的字符串个数。查看该方法源码的话,你就可以看到以下内容:
直接 substring() 到原字符串的末尾,也就是说,第二个分隔符处不再拆分。然后就 break 出循环了。来看一下程序输出的结果:
第一部分:沉默王二 第二部分:一枚有趣的程序员,宠爱他
好了,我亲爱的读者朋友,以上就是本文的全部内容了。是不是突然感觉拆分个字符串真的挺讲究的?
我是沉默王二,一枚有趣的程序员。如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读。