首页 > 技术文章 > C#中使用Split分隔字符串的技巧 (转自百度文库)

zhanghai 2014-04-10 17:19 原文

C#中使用Split分隔字符串的技巧 

 

作者:icech整理 发布时间:2009-8-18 16:12:13 文章来源:西部E网 

在分割字符串的时候我们常常会用到Split,下面我们就来学习一下分割字符串的技巧和方法。

 

1、使用String.Split单字符分割

 

String.Split方法

 

命名空间:System

程序集:mscorlib(在 mscorlib.dll 中)

 

返回的字符串数组包含此实例中的子字符串(由指定字符串或 Unicode 字符数组的元素分隔)。 

 

Split(Char[])  

返回的字符串数组包含此实例中的子字符串(由指定 Unicode 字符数组的元素分隔)。  

 

Split(Char[], Int32)  

返回的字符串数组包含此实例中的子字符串(由指定 Unicode 字符数组的元素分隔)。参数指定返回的子字符串的最大数量。 

 

Split(Char[], StringSplitOptions)  

返回的字符串数组包含此字符串中的子字符串(由指定 Unicode 字符数组的元素分隔)。参数指定是否返回空数组元素。  

 

Split(String[], StringSplitOptions)  

返回的字符串数组包含此字符串中的子字符串(由指定字符串数组的元素分隔)。参数指定是否返回空数组元素。  

 

Split(Char[], Int32, StringSplitOptions)  

返回的字符串数组包含此字符串中的子字符串(由指定 Unicode 字符数组的元素分隔)。参数指定要返回子字符串的最大数量,以及是否要返回空数组元素。  

 

Split(String[], Int32, StringSplitOptions)  

返回的字符串数组包含此字符串中的子字符串(由指定字符串数组的元素分隔)。参数指定要返回子字符串的最大数量,以及是否要返回空数组元素。

 

示例1:

 

string s=abcdeabcdeabcde;

string[] sArray=s.Split('c') ;

foreach(string i in sArray)

Console.WriteLine(i.ToString());

输出下面的结果:

ab

deab

deab

de

 

示例2:

 

string s="abcdeabcdeabcde";

string[] sArray1=s.Split(new char[3]{'c','d','e'}) ;

foreach(string i in sArray1)

Console.WriteLine(i.ToString());

可以输出下面的结果:

ab

ab

ab

 

示例3:

string str1=我*****是*****一*****个*****教*****师;

string[] str2;

str1=str1.Replace(*****,*) ;

str2=str1.Split(*) ;

foreach(string i in str2)

Console.WriteLine(i.ToString());

 

示例4:

 

string str1=我**是*****一*****个*****教*****师;

我希望显示的结果为:我是一个教师。

我如果采用上面的第四种方法来做就会产生下面的错误:我   是一个教师。中间有空格输出,所以输出结果并不是希望的结果,这就又回到了正则表达式了,这时可以采用下面的第五种方法:

string str1=我**是*****一*****个*****教*****师;

string[] str2 = System.Text.RegularExpressions.Regex.Split(str1,@[*]+);

foreach(string i in str2)

Console.WriteLine(i.ToString());

这里通过[*]+ 巧妙的完成了我们的目标。

 

示例5:

 

string strBreak = "|";

string str= "111"+ strBreak +"222"+ strBreak +"333"+ strBreak +"444";

string[] arr1=str.Split('|') ;

foreach(string i in arr1)

Response.Write( i.ToString() +"<br>\n");

 

结果(符合要求)

===============

111<br>

222<br>

333<br>

444<br>

 

示例6:

 

tring strBreak = "||";

string str= "111"+ strBreak +"222"+ strBreak +"333"+ strBreak +"444";

char[] arrChr = strBreak.ToCharArray();

string[] arr1=str.Split(arrChr) ;

//string[] arr1=str.Split(new char[2]{'|','|'}) ;//或者这样写

foreach(string i in arr1)

Response.Write( i.ToString() +"<br>\n");

 

结果(有几个字符就会打印几个<br>,不符合要求)

===============

111<br>

<br>

222<br>

<br>

333<br>

<br>

444<br>

 

示例7:

 

用正则来处理多字符的情况。

 

string strBreak = "||";

string str= "111"+ strBreak +"222"+ strBreak +"333"+ strBreak +"444";

string[] arr1=Regex.Split(str,@"\|\|",RegexOptions.IgnoreCase);

//string[] arr1=Regex.Split(str,"\\u007C\\u007C",RegexOptions.IgnoreCase); //也可以用 \\u007C 替代特殊字符 |

 

foreach(string i in arr1)

Response.Write( i.ToString() +"<br>\n");

 

结果(符合要求)

===============

111<br>

222<br>

333<br>

444<br>

 

 

2、使用Regex.Split多字符分割

 

命名空间:System.Text.RegularExpressions

程序集:System(在 system.dll 中)

 

Regex.Split 方法与  Split  方法类似,但后一种方法在由正则表达式而不是一组字符确定的分隔符处拆分字符串。如果指定 count,则至多将该字符串拆分为 count 个字符串(最后一个字符串包含该字符串其余未拆分的部分);count 值为零则采用默认拆分行为(即尽可能多地进行拆分)。如果指定了 startat,则搜索第一个分隔符,以便从指定的位置开始执行操作(例如,这可以用于跳过前导空白)。

 

如果在 Regex.Split 表达式中使用捕获组,则生成的字符串数组中会包含捕获组。下面的示例会产生数组项“one”、“-”、“two”、“-”、“banana”。

 

Regex r = new Regex("(-)"); // Split on hyphens.

string[] s = r.Split("one-two-banana");

 

如果正则表达式可以匹配空字符串(例如 x*),则 Split 会将字符串拆分为由单个字符组成的字符串的数组,因为在每个位置都可以找到空字符串分隔符。

 

静态 Split 方法等效于使用指定的正则表达式模式构造 Regex 对象并调用实例方法 Split。提供静态方法是为了独立、单独地使用正则表达式,而不用显式创建 Regex 对象。

 

示例1:

 

using System.Text.RegularExpressions;

 

string str="aaajsbbbjsccc";

string[] sArray=Regex.Split(str,"js",RegexOptions.IgnoreCase);

foreach (string i in sArray) Response.Write(i.ToString() + "<br>"); 

 

===================

最近经常看到论坛中许多帖子询问如何使用split来分割字符串,我这里对split做一些简单的总结,希望能够对大家有所帮助。下面介绍几种方法:

 

第一种方法:打开vs.net新建一个控制台项目。然后在Main()方法下输入下面的程序。

 

      string s="abcdeabcdeabcde";

 

       string[] sArray=s.Split(''c'');

 

       foreach(string i in sArray)

 

       Console.WriteLine(i.ToString());

 

        输出下面的结果:ab

 

                       deab

 

                       deab

 

                       de

 

                         

 

    我们看到了结果是以一个指定的字符进行的分割。如果我们希望使用多个字符进行分割如c,d,e如何做呢?好,我们使用另一种构造方法:

 

       更改为     string s="abcdeabcdeabcde

 

     string[] sArray1=s.Split(new char[3]{''c'',''d'',''e''});

 

        foreach(string i in sArray1)

 

        Console.WriteLine(i.ToString());

 

    可以输出下面的结果:ab

 

                       ab

 

                       ab

 

  除了以上的这两种方法以外,第三种方法是使用正则表达式。新建一个控制台项目。然后先添加 using System.Text.RegularExpressions;

'http://www.knowsky.com

Main() :中更改为

 

       System.Text.RegularExpressions

 

      string content="agcsmallmacsmallgggsmallytx";

 

      string[]resultString=Regex.Split(content,"small",RegexOptions.IgnoreCase)

       foreach(string i in resultString)

        Console.WriteLine(i.ToString());

 

        输出下面的结果:agc

                       mac

                       ggg

                       ytx

使用正则表达式有什么好处呢?别着急,后面我们会看到它的独特之处。

下面介绍第4种方法。比如

 

    string str1="我*****是*****一*****个*****教*****师";

 

    如果我希望显示为:我是一个教师,  ,如何作呢?我们可以使用下面代码:

 

      string str1="我*****是*****一*****个*****教*****师;

 

       string[] str2;

 

       str1=str1.Replace("*****","*");

 

       str2=str1.Split(''*'');

 

      foreach(string i in str2)

 

       Console.WriteLine(i.ToString());

 

这样也可以得到正确结果。但是比如

 

    string str1="我**是*****一*****个*****教*****师";

 

      我希望显示的结果为:我是一个教师。

 

      我如果采用上面的第四种方法来做就会产生下面的错误:我   是一个教师

 

      中间有空格输出,所以输出结果并不是我希望的结果,如何解决呢?这就又回到了正则表达式了(这里可以看到它的功能强大之处),这时可以采用下面的第五种方法:

 

      string str1="我**是*****一*****个*****教*****师";

 

    string[] str2 = System.Text.RegularExpressions.Regex.Split(str1,@"[*]+");                                                       

 

foreach(string i in str2)

 

Console.WriteLine(i.ToString());

 

这里通过"[*]+" 巧妙的完成了我们的目标。

 

推荐阅读