`
MouseLearnJava
  • 浏览: 460169 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

String split方法使用小结

    博客分类:
  • Java
阅读更多

String对象的split方法提供了字符串分割的功能。split方法的参数可以是正则表达式,这样的话可以支持相对复杂的字符串分割。

比如: 
"Welcome;to,the Java:World".split("[;|,| |:]")
将得到由"Welcome" "to" "the" "Java""World"组成的字符串数组。

1. String对象的split方法里面采用了Pattern的split方法实现,所以,正则表达式中的某些符号需要正则转义才能得到正确的分割结果。

String(JDK 7)中的split源码如下:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    public String[] split(String regex) {
        return split(regex, 0);
    }
 public String[] split(String regex, int limit) {
        /* fastpath if the regex is a
         (1)one-char String and this character is not one of the
            RegEx's meta characters ".$|()[{^?*+\\", or
         (2)two-char String and the first char is the backslash and
            the second is not the ascii digit or ascii letter.
         */
        char ch = 0;
        if (((regex.value.length == 1 &&
             ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
             (regex.length() == 2 &&
              regex.charAt(0) == '\\' &&
              (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
              ((ch-'a')|('z'-ch)) < 0 &&
              ((ch-'A')|('Z'-ch)) < 0)) &&
            (ch < Character.MIN_HIGH_SURROGATE ||
             ch > Character.MAX_LOW_SURROGATE))
        {
            int off = 0;
            int next = 0;
            boolean limited = limit > 0;
            ArrayList<String> list = new ArrayList<>();
            while ((next = indexOf(ch, off)) != -1) {
                if (!limited || list.size() < limit - 1) {
                    list.add(substring(off, next));
                    off = next + 1;
                } else {    // last one
                    //assert (list.size() == limit - 1);
                    list.add(substring(off, value.length));
                    off = value.length;
                    break;
                }
            }
            // If no match was found, return this
            if (off == 0)
                return new String[]{this};

            // Add remaining segment
            if (!limited || list.size() < limit)
                list.add(substring(off, value.length));

            // Construct result
            int resultSize = list.size();
            if (limit == 0)
                while (resultSize > 0 && list.get(resultSize - 1).length() == 0)
                    resultSize--;
            String[] result = new String[resultSize];
            return list.subList(0, resultSize).toArray(result);
        }
        return Pattern.compile(regex).split(this, limit);
    }

}


比如要想采用$ . |这三个符号分割字符串,需要进行转义才能得到正确的结果。
"Welcome.to.the.Java.World".split("\\.");

"Welcome|to|the|Java|World".split("\\|");

"Welcome$to$the$Java$World".split("\\$");


2. 默认状态下,split处理后得到的子字符串数组会去掉后面的空子字符串的内容。

比如:
",,,,,,,".split(",")
得到的数组长度是0.

"hello,Java,,,,,,".split(",")
得到的数组长度是2.

这是由如下逻辑的代码实现的:
// Construct result
            int resultSize = list.size();
            if (limit == 0)
                while (resultSize > 0 && list.get(resultSize - 1).length() == 0)
                    resultSize--;
            String[] result = new String[resultSize];
            return list.subList(0, resultSize).toArray(result);


3. 正确使用方法split(String regex, int limit),使用正确的limit值得到不一样的结果。

a): 如果想要得到的子字符串数组包含后面的空字符串,可以将limit设置为-1.
"hello,Java,,,,,,".split(",",-1)
得到的数组长度为8

b): 如果limit设置的值大于分割得到子字符串长度,得到的数组与limit值等于-1的情况是一样的。

c): 用limit控制分割的范围。
  比如,在文本文件中每行存储的内容格式如下:
  编号,书名,描述
每行的内容用逗号隔开,其中描述的内容也可能有逗号,但是,我们并不想把描述这一项内容用逗号分割,这个例子中,我们可以将limit设置为3即可。

package my.string;

public class StringSplitTest {

	public static void main(String[] args) {
		
		String[] array1 = "No.1,Java Programming,It is funny,and it is interresting.".split(",",3);
		printArray(array1);
	}
	
	private static void printArray(String[] array)
	{
		System.out.println("数组长度:"+array.length);
		for(String str: array)
		{
			System.out.println(str);
		}
	}
}



输出内容如下:


数组长度:3
No.1
Java Programming
It is funny,and it is interresting.


另外,除了split方法,还可以用如下的方式实现:
1. 采用String Tokenizer实现
2. 采用indexOf与subString结合的方式实现
... ...
1
2
分享到:
评论
3 楼 hailongshih 2013-08-28  
谢谢你,细心问题,thanks
2 楼 MouseLearnJava 2013-08-28  
hailongshih 写道
Good,收藏,但有个问题愿意跟lz探讨:
String str="hello,Java,,,,,,";
String[] strs = str.split(",",-1);
for (int i = 0; i < strs.length; i++) {
   System.out.println(strs[i]);
  }
在这里得到的strs数组长度为8,但是最后只打印出hello,我调试过发现其中java已经打印出来又收回,这是怎么回事


你好,产生你描述的行为,我想是这种情况引起的:你的console窗口高度太窄

再运行一下程序试试,然后将console控制台输出窗口高度拉升一点或者将控制台输出窗口右边的滚动条拉至最顶部,你就可以看到输出的hello字符串了。
1 楼 hailongshih 2013-08-28  
Good,收藏,但有个问题愿意跟lz探讨:
String str="hello,Java,,,,,,";
String[] strs = str.split(",",-1);
for (int i = 0; i < strs.length; i++) {
   System.out.println(strs[i]);
  }
在这里得到的strs数组长度为8,但是最后只打印出hello,我调试过发现其中java已经打印出来又收回,这是怎么回事

相关推荐

    String.split()方法使用总结

    String.split()方法使用总结

    stringstream操纵string的方法总结

    在用C++操纵字符串的时候,我一直使用很笨的遍历的方法。为此,我问候过很多次C++标准委员会。直到某一天,我做了一个处理绝对路径的题目。 首先,我要把‘/’作为分隔符,把输入字符串split一下。下面是我的代码:...

    Java中String.split()用法小结

    主要介绍了Java中String.split()用法小结的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    c# split分隔字符串使用方法

    代码如下:string str=”aaa|||bbb|||ccc”; string[] sArray=str.Split(new[] { “|||”... 您可能感兴趣的文章:C#中使用Split方法拆分字符串实例C#中使用split分割字符串的几种方法小结C# Split分隔字符串的应用(C#、s

    PowerShell String对象方法小结

    从之前的章节中,我们知道PowerShell将一切存储在对象中,那这些对象中包含了一系列中的称之为方法的...另外一条途径,使用Split方法,对文件的完整名称进行分割,得到一个字符串数组,取最后一个元素,PowerShell中可

    C#中使用split分割字符串的几种方法小结

    第一种方法: 代码如下:string s=abcdeabcdeabcde;...使用另一种构造方法对多个字符进行分割: 代码如下:string s=abcdeabcdeabcdestring[] sArray1=s.Split(new char[3]{c,d,e}) ;foreach(string i in sArray1

    C#中split用法实例总结

    本文实例总结了C#中split用法。分享给大家供大家参考,具体如下: 以下是我转载的两个不同的人的,方便大家及自己查阅 string s=abcdeabcdeabcde; string[] sArray=s.Split(c); foreach(string i in sArray) ...

    正则表达式模式匹配的String方法

    在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace、match、search等方法,以下是对一些方法使用的总结。 String对象中支持正则表达式有4种方法,分别是:...

    js split函数用法总结(从入门到精通)

    split定义和用法 split() 方法用于把一个字符串分割成字符串数组。 语法 stringObject.split(separator,howmany) 参数 描述 separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。 howmany 可...

    Linux里awk中split函数的用法小结

    The awk function split(s,a,sep) splits a string s into an awk array a using the delimiter sep. set time = 12:34:56set hr = `echo $time | awk ‘{split($0,a,”:” ); print a[1]}’` # = 12set sec = `echo...

    SQL中实现SPLIT函数几种方法总结(必看篇)

    create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10)) returns @temp table(a varchar(100)) --实现split功能 的函数 --date :2003-10-14 as begin declare @i int set @SourceSql=rtrim...

    String字符串匹配javascript 正则表达式

    在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace、match、search等方法,下面所述是对相关方法使用的总结,需要的朋友参考下。 String对象中支持正则表达式...

    Java编码规范总结

    修复建议:String的split方法传递的参数是正则表达式,正则表达式本身用到的字符需要转义,如:句点符号“.”,美元符号“$”,乘方符号“^”,大括号“{}”,方括号“[]”,圆括号“()” ,竖线“|”,星号“*”,...

    C++常用字符串分割方法实例汇总

    我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用。 一、用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串。 参数...

    PHP中str_split()函数的用法讲解

    str_split( _string,length_ ) 实例 1 使用 length 参数: &lt;?php print_r(str_split(Hello,3)); ?&gt; 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢...

    TCL培训教程(全)

    1引言 2语法 2.1脚本、命令和单词符号 2.2置换(substitution) 2.2.1变量置换(variable subtitution) 2.2.2命令置换(command substitution) 2.2.3反斜杠置换(backslash substitution) 2.2.4双引号和花括号 ...14总结

    Python数组遍历的简单实现方法小结

    本文实例总结了Python数组遍历的简单实现方法。分享给大家供大家参考,具体如下: &gt;&gt;&gt; os.__file__.split('\\') ['E:', 'Python', 'Python25', 'lib', 'os.pyc'] &gt;&gt;&gt; os.path.split(os.__file__) ('E:\\Python\\...

    javascript语言参考+教程 CHM

    split 方法; sqrt 方法; strike 方法; sub 方法; substr 方法; substring 方法; sup 方法; tan 方法; test 方法; toArray 方法; toDateString 方法; toExponential 方法; toFixed 方法; toGMTString ...

    asp.net分割字符串的几种方法小结

    下面一一介绍一下: 1、最简单最常用的方法,以一个指定的字符进行的分割 打开vs... 输出下面的结果: ab deab deab de 2、使用多个字符进行分割 代码如下: string s=”abcdeabcdeabcde” string[] sArray1=s.Split(n

Global site tag (gtag.js) - Google Analytics