`
MouseLearnJava
  • 浏览: 466248 次
  • 性别: 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()方法使用总结” 标题明确指出本文将围绕`String.split()`方法的使用进行深入探讨,旨在总结其功能、用法以及一些实践中的注意事项。这表明文章的目标读者是对Java编程有一定了解,...

    java的String[] split 示例

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

    stringstream操纵string的方法总结

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

    pb分割字符串,自己写的split()方法

    本文将详细介绍一种自定义的`split()`方法,该方法可以在PB环境中使用,帮助开发者轻松地将字符串按照指定的分隔符进行分割,并返回一个字符串数组。下面我们将从该方法的设计思路、参数说明、代码实现以及使用示例...

    java String类常用方法练习小结

    - **`split(String regex)`**:使用给定的正则表达式将此字符串分割成一个字符串数组。 ### 4. 字符串不可变性 `String`类的实例是不可变的,这意味着一旦创建了一个`String`对象,就不能更改它的内容。所有改变...

    String类方法总结

    标题:“String类方法总结” 描述:“string类方法总结,由毕姥爷精心提炼,被誉为学习String类的必读经典。” **知识点详述:** 在Java编程语言中,`String`类是一个极其重要的类,用于处理文本数据。由于其不可...

    Java中String.split()用法小结

    总之,`String.split()`方法是Java中进行字符串切割的重要工具,正确理解和使用正则表达式转义规则是关键。在编写代码时,一定要注意特殊字符的处理,确保它们被正确地解析为分隔符,而不是正则表达式的一部分。同时...

    有关Java String常用方法的总结.docx

    ### 有关Java String常用方法的总结 #### 一、String 类概述 `String`类是Java中最基础也是最重要的数据类型之一,在Java中被定义为一个不可变类(immutable class),这意味着一旦一个`String`对象创建之后,其...

    Javascript实现Array和String互转换的方法

    本文将详细介绍如何使用JavaScript内置方法来实现数组与字符串之间的转换,其中涉及到了两个重要的字符串处理方法:toString方法和split方法。 首先,Array转为String。在JavaScript中,数组对象的toString方法可以...

    delphi的Split实现方法

    #### 方法三:使用`TStringList`内置功能 除了自定义Split函数,Delphi还提供了`TStringList`类的内置方法来简化字符串分割过程,如`DelimitedText`属性。 ```pascal procedure TForm1.Button3Click(Sender: T...

    java中的split的用法

    `String`类提供了多种方法来处理字符串,其中`split`方法因其灵活性和强大的分割功能而被广泛使用。本文将深入探讨`split`方法的用法,并通过具体的例子帮助读者更好地理解和掌握这一知识点。 #### 二、`split`方法...

    java的split方法使用示例

    Java中的`split()`方法是String类的一个非常重要的成员函数,它用于将字符串按照指定的分隔符进行切割,返回一个字符串数组。这个方法在处理文本数据时尤其有用,例如解析CSV格式的数据、处理用户输入或者从日志文件...

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

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

    Java的split方法使用详解

    Java的`split`方法是String类的一个非常重要的成员函数,用于根据指定的分隔符将字符串分割成多个子字符串,并返回一个字符串数组。这个方法在处理数据时非常有用,例如解析CSV格式的数据或者处理带有固定分隔符的...

    为JavaScript中的String添加一些常用方法

    这个`reverseWords`方法首先使用`split(' ')`将字符串按空格拆分成单词数组,然后对每个单词应用`split('')`、`reverse()`和`join('')`,最后使用`join(' ')`将单词重新组合成一个字符串,但单词顺序反转。...

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

    总结来说,Java的`String.split()`方法在处理结尾空字符串时,可能因为默认行为而丢失这部分内容。为了避免这种情况,可以使用`split(regex, -1)`形式的重载方法,确保所有的子字符串,包括结尾的空字符串,都能被...

    String方法总结

    ### String方法总结 #### Length():int 获取字符串长度 - **定义**:`length()` 方法用于获取当前字符串的长度。此方法返回的是一个整型值,表示字符串中字符的数量。 - **应用场景**:常用于需要知道字符串长度的...

    C# split 函数的用法

    这里,我们使用了 `Regex.Split` 方法,并且设置了 `RegexOptions.IgnoreCase` 参数来忽略大小写,从而正确地识别出 `"hello"` 并以此为界进行分割。 #### 总结 通过上述示例可以看出,`Split` 方法在处理字符串...

    PowerShell String对象方法小结

    ### PowerShell String对象方法详解 PowerShell作为一种强大的自动化和配置管理工具,在Windows系统管理及脚本编写中占有举足轻重的地位。其中,`String`对象是处理文本数据的基础,掌握其方法对于高效地管理和操作...

Global site tag (gtag.js) - Google Analytics