`
messi_18
  • 浏览: 98972 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String.split

    博客分类:
  • java
 
阅读更多
String.split(String reg)这个方法一点不陌生。经常用:
"a|b|c".split("\\|")

结果是:
["a","b","c"]

但是,如果改一下输入参数呢?
"a|b|".split("\\|")

结果是:
["a","b"]


这是你想要的吗?如果是,我不废话了。如果不是,那怎么办呢?
反正这不是我想要的,我想要:
["a","b",""]

我绕了一大圈子:我去找apache commons中有没有这样的实现,没有找到。于是我开始自己写一个:
static String[] newsplit(String str) {
        if (str == null || str.length() == 0) {
            return new String[0];
        }
        
        List<Integer> indexes = new LinkedList<Integer>();
        indexes.add(-1);
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '|') {
               indexes.add(i);
            }
        }
        
        indexes.add(str.length());
        
        List<String> list = new LinkedList<String>();
        for (int i = 0; i < indexes.size()-1; i++) {
            list.add(str.substring(indexes.get(i)+1,indexes.get(i+1)));
        }
        
        return list.toArray(new String[0]);
    }

我自以为可以了。于是开始测试这个方法,我用了一个复杂点的例子"a||b|c|"。还好JUnit绿了。好兴奋啊。这时候,我想不明白为何JDK不提供这么简单的实现,于是我又试了下:
"a||b|c|".split("\\|")
结果是:
["a","","b","c"]

结尾的那一项还是没了,但是中间的那个空字符串竟然还在。不会吧!难道?!我打开了jdk的api的页面。看到了还有这样一个方法:Pattern.split(CharSequence,int)。然后看到了这样一段话:
The limit parameter controls the number of times the pattern is applied and therefore affects the length of the resulting array. If the limit n is greater than zero then the pattern will be applied at most n - 1 times, the array's length will be no greater than n, and the array's last entry will contain all input beyond the last matched delimiter. If n is non-positive then the pattern will be applied as many times as possible and the array can have any length. If n is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.

然后,我试了下
"a||b|c|".split("\\|",-1)
结果就是我想要的。一刹那我想撞墙。为什么,一开始不仔细在jdk中先看看啊。

反思:
1>当你遇到一个问题,最优的解决方式就在最近的地方。
2>熟悉api是非常重要的。
3>不要手贱。
分享到:
评论

相关推荐

    String.split()方法使用总结

    在Java编程语言中,`String.split()`方法是一个非常实用且强大的工具,用于将字符串分割成字符串数组,基于正则表达式或指定的分隔符。这个方法为处理文本数据提供了极大的灵活性,尤其在解析CSV文件、配置文件或者...

    Java中String.split()用法小结

    Java中的`String.split()`方法是用于将一个字符串按照指定的分隔符进行切割,返回一个字符串数组。这个方法是基于正则表达式的,因此在处理某些特殊字符时需要注意字符的转义。 1. **基本用法** `String.split()`...

    power-split:有时string.split()还不够!

    功率分配因为有时String.split()还不够! 这是一个小型的Typescript库,我出于无奈而从头开始编写了命令行解析器。 它提供了一些实用程序方法来解决一些用例,而这些用例String.split()调用将无法解决。它能做什么?...

    浅谈java String.split丢失结尾空字符串的问题

    在Java编程语言中,`String`类提供了许多实用的方法,其中之一就是`split()`。这个方法用于根据指定的分隔符将字符串分割成多个子字符串,并返回一个字符串数组。然而,有时候开发者可能会遇到一个问题,即使用`...

    C# 中string.split用法详解

    string[] sArray=s.Split('c') ; foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab deab deab de 第二种方法 我们看到了结果是以一个指定的字符进行的分割。使用另一种构造方法对...

    String类的intern、split方法

    String类的intern、split方法 String 类的 intern 方法是一个本地方法,定义如下:public native String intern();该方法返回一个字符串对象的内部化引用,由 String 类维护一个初始为空的字符串的对象池,当 ...

    string-split.js:柯里化的 `String.prototype.split` 支持按字符串、RegExp 或函数进行拆分

    柯里化的String.prototype.split支持按字符串、正则表达式或函数进行拆分。 npm install string-split --save npm 统计信息 例子 要求 var split = require ( 'string-split' ) ; 完整的应用程序 split ( "." , ...

    String split函数

    "String split函数的使用技巧" String split函数是 Java 中 String 类的一种常用函数,用于将一个字符串分割为子字符串,并将结果作为字符串数组返回。在实际开发中,String split函数经常被用于数据处理和字符串...

    sql 分割字符串 dbo.Split('',',')

    将字符串按某个固定字符拆分成一个表结构(value,id) eg:1,2,3,3,4 拆分后: value id 1 1 2 2 3 3 3 4 4 5

    java的String[] split 示例

    在Java编程语言中,`String`类提供了许多用于操作字符串的方法,其中之一便是`split`方法。这个方法在处理文本数据时极为有用,特别是在需要根据特定的分隔符将字符串分割成多个子串的情况下。下面,我们将深入探讨`...

    jsstring操作.pdf

    `string.split(separator, limit)`方法根据`separator`将字符串分割成数组。`limit`参数限制返回数组的长度。例如,`"a1,b1,c1".split(",")`返回`["a1", "b1", "c1"]`,`"a,b,c".split(",", 2)`返回`["a", "b"]`,`...

    C#中Split用法

    string[] split4 = words.Split(new char[] { ',', '.' }, StringSplitOptions.RemoveEmptyEntries); Console.WriteLine($"Split by ',' and '.', removing empty entries: {string.Join(", ", split4)}"); ``` ...

    关于split笔记

    String[] stringArray = srcString.split("\\s+"); ``` 在此例中,`\\s+`表示一个或多个空白字符(包括空格、制表符等),因此`split("\\s+")`会将字符串按所有连续的空白字符分割。 #### 示例2:分割字符串至特定...

    ZP宏图文示例解析

    例如,若要提取"username:pass:login:password"中以":"分隔的第三部分,代码`{-String.Split-|-username:pass:login:password-|-:-|-3-}`将返回"password"。 7. **Count of chunks after split(读取字符串有几个...

    字符串string.zip

    4. **字符串操作**:字符串可以进行连接(`+`运算符或`StringBuilder`/`StringBuffer`)、查找与替换(`indexOf()`, `replace()`, `replaceAll()`)、分割(`split()`)等操作。 5. **字符串与字符数组的转换**:`...

    网址收藏 网址收藏 网址收藏

    string[] ss2 = classString.Split(new string[] { CConst.SPLITOR_CLASS_ITEM }, StringSplitOptions.RemoveEmptyEntries); foreach (string s in ss2) _classList.Add(new CClass(s)); string[] ss3 = ...

    javascript函数大全

    replaceString)替换现有字符串. 100.string.split(分隔符)返回一个数组存储值. 101.string.substr(start[,length])取从第几位到指定长度的字符串. 102.string.toLowerCase()使字符串全部变为小写. 103....

    用string拆分字符串.zip

    std::vector&lt;std::string&gt; split(const std::string &s, char delimiter) { std::vector&lt;std::string&gt; tokens; std::string token; std::istringstream tokenStream(s); while (std::getline(tokenStream, token...

Global site tag (gtag.js) - Google Analytics