String split方法与Guava Splitter用法区别
String split方法与Guava Splitter用法区别
今天同事写了一段使用String split方法的代码,如下所示,同事期望得到的是字符"1",但是没想到却得到空字符。
String targetStr = "1";
String[] splitStrs = targetStr.split("//|");
for (String spiltStr : splitStrs) {
System.out.println(spiltStr);
}
同事修改成如下代码,可得到的结果也不正确
String[] splitStrs = targetStr.split("|");
对这个问题我也不算特别清楚,因此只好先建议同事修改为如下代码,修改后同事获得了正确的结果
final Iterable<String> stringIterable = Splitter.on("|").split(targetStr);
其实问题出在split方法的入参上,查阅String split方法可知道入参其实是一个正则表达式
/* @param regex
* the delimiting regular expression
*
* @return the array of strings computed by splitting this string
* around matches of the given regular expression
*
* @throws PatternSyntaxException
* if the regular expression's syntax is invalid
*
* @see java.util.regex.Pattern
*
* @since 1.4
* @spec JSR-51
*/
public String[] split(String regex) {
return split(regex, 0);
}
既然入参是正则表达式,那就应该用正则表达式去进行解答,在正则表达式中"|"代表的含义是或,因此之前的"//|"应当理解成为匹配字符中存在"//"或空字符,并按匹配进行分割。当按照空字符进行分割是,则得到的就是空字符与"1"了,并且将"//|"修改为"|"也无法纠正错误,仍然是按空字符进行分割。这里同事犯了两个错误:
- 错用了转义字符,应当使用""而不是"/"
- 误解了split方法的入参,没有意识到这是一个正则表达式
所以想要获得正确的结果,可以使用以下几种写法
String[] splitStrs1 = targetStr.split("\\|");
String[] splitStrs2 = targetStr.split("[|]");
String[] splitStrs3 = targetStr.split(Pattern.quote("|"));
那么为何Guava Splitter能够获得正确的结果呢?还是要从参数入手,从on方法定义可以看出,作为分隔符的入参可以是多种类型的,如下。
public static Splitter on(char separator);
public static Splitter on(final CharMatcher separatorMatcher);
public static Splitter on(final String separator);
@GwtIncompatible("java.util.regex")
public static Splitter on(final Pattern separatorPattern);
on方法的入参可以是单字符、字符串以及正则表达式,最大程度地保证了使用者不会因为没有检查入参含义而导致误用的问题,从易用性和友好程度角度出发,Guava的大多数方法确实更有优势,用Splitter实现上述代码,如下。
final Iterable<String> splits1 = Splitter.on('|').split(targetStr);
final Iterable<String> splits2 = Splitter.on("|").split(targetStr);
final Iterable<String> splits3 = Splitter.on(new CharMatcher() {
@Override
public boolean matches(char c) {
return c == '|';
}
}).split(targetStr);
final Iterable<String> splits4 = Splitter.on(Pattern.compile("\\|")).split(targetStr);
String split方法与Guava Splitter用法区别的更多相关文章
- C# String.split()用法小结。String.Split 方法 (String[], StringSplitOptions)
split()首先是一个分隔符,它会把字符串按照split(' 字符')里的字符把字符串分割成数组,然后存给一个数组对象. 输出数组对象经常使用foreach或者for循环. 第一种方法 string ...
- [Java] String.Split 方法的6个重载函数
String.Split 方法有6个重载函数: 程序代码 1) public string[] Split(params char[] separator) 2) public string[] Sp ...
- java String.split方法是用注意点(转)
转自:http://www.blogjava.net/fanyingjie/archive/2010/08/05/328059.html 在java.lang包中有String.split()方法,返 ...
- java学习笔记之String.Split方法
hello 大家好,好久不见,今天 我们要讨论的是java的split方法,或许你很早就知道了,但你真的知道吗? 我们来看看吧. 首先我们来看看我们最常用的split()方法也就是单个参数的方法 pu ...
- String.split()方法你可能不知道的一面
一.问题 java中String的split()是我们经常使用的方法,用来按照特定字符分割字符串,那么我们看以下一段代码: public void splitTest() { String str = ...
- as3 string split方法一些注意
split () 方法 AS3 function split(delimiter:*, limit:Number = 0x7fffffff):Array 如果指定 limit 参数,返回的数组中具有的 ...
- String.split()方法
如果用“(”作为分隔的话,必须是如下写法,String.split("\\("),这样才能正确的分隔开,不能用String.split("("); 如果用“)” ...
- java String.split()函数的用法分析
java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...
- java中String对象的split方法
在java.lang包中有String.split()方法,返回是一个String[]数组,今天碰到一个自己没注意的问题: 1.特殊分隔符 String str1 = "123|456|78 ...
随机推荐
- solr 字段设置不存储表示不会进行分词
solr 字段设置不存储表示不会进行分词
- BZOJ3523[Poi2014]Bricks——贪心+堆
题目描述 有n种颜色的砖块,第i种颜色的砖块有a[i]个,你需要把他们放成一排,使得相邻两个砖块的颜色不相同,限定第一个砖块的颜色是start,最后一个砖块的颜色是end,请构造出一种合法的方案或判断 ...
- BZOJ5206 JSOI2017原力(三元环计数)
首先将完全相同的边的权值累加.考虑这样一种trick:给边确定一个方向,由度数小的连向度数大的,若度数相同则由编号小的连向编号大的.这样显然会得到一个DAG.那么原图的三元环中就一定有且仅有一个点有两 ...
- .net 手机滑动加载
$(window).scroll(function () { var scrollTop = $(this).scrollTop(); var scrollHeight = $(document).h ...
- python 操作系统模块 -- OS
os,语义为操作系统,模块提供了访问多个操作系统服务的功能,可以处理文件和目录这些我们日常手动需要做的操作.os和它的子模块os.path还包括一些用于检查.构造.删除目录和文件的函数,以及一些处理路 ...
- hdu 3397 Sequence operation (线段树 区间合并 多重标记)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意: 给你一串01串,有5种操作 0. 区间全部变为0 1.区间全部变为1 2.区间异或 3.询问 ...
- install kubernetes cluster k8s集群安装
一,安装docker-ce 17.031,下载rpm包 Wget -P /tmp https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/ ...
- UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)
UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There W ...
- P1186 玛丽卡 删边最短路最大值
反正蛮水的一道题. 胡雨菲一句话让我的代码减少了10行还A了,之前的是个错的. 思路:先求出最短路,然后依次删去最短路上的每一条边,跑最短路求最大值. 关于删边:我的想法是当作链表删除,把last的n ...
- Python基础学习(四)
菜鸟咀嚼python基础之继续. 一.返回函数 第三章已经简单操作了Python的高阶函数,目前继续练手函数作为返回值的特效:通常,高阶函数除了可以接收函数作为参数外,还可以把函数作为结果值返回. 案 ...