本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

String.Split 方法 (Char[])

 

基于数组中的字符将字符串拆分为多个子字符串。

命名空间:   System
程序集:  mscorlib(位于 mscorlib.dll)

public string[] Split(
	params char[] separator
)

参数

separator
Type: System.Char[]

分隔此字符串中子字符串的字符数组、不包含分隔符的空数组或 null

返回值

Type: System.String[]

一个数组,其元素包含此实例中的子字符串,这些子字符串由 separator 中的一个或多个字符分隔。 有关详细信息,请参阅“备注”部分。

当字符串分隔的一组已知的字符时,你可以使用Split(Char[])方法将其单独放入子字符串。 从字符串提取子字符串的其他方法,请参阅String.Split 的替代方法部分。

返回的数组的元素中不包含分隔符字符。 例如,如果分隔符数组包含字符"-"和当前的字符串实例的值是"aa bb cc",该方法返回一个数组,包含三个元素:"aa"、"bb"和"抄送"。

如果此实例不包含任何中的字符separator,返回的数组包含一个包含此实例的单个元素。

每个元素separator定义单独的分隔符字符。 如果两个分隔符相邻,或者开头或的此实例的末尾找到分隔符,则返回的数组中的相应元素包含Empty 下面是一些可能的恶意活动:

字符串值

Separator

返回的数组

"42, 12, 19"

新 Char [] {',',' '} (C#)

Char () = {"、"c,""c}) (Visual Basic)

{"42", "", "12", "", "19"}

"42..12..19"

新 Char [] {'。 '} (C#)

Char () = {"。"c} (Visual Basic)

{"42", "", "12", "", "19"}

"香蕉"

新 Char [] {'。 '} (C#)

Char () = {"。"c} (Visual Basic)

{"香蕉"}

"Darb\nSmarba"(C#)

"Darb"1 & vbLf."Smarba"(Visual Basic)

新 Char [] {} (C#)

Char () = {} (Visual Basic)

{"Darb","Smarba"}

"Darb\nSmarba"(C#)

"Darb"1 & vbLf."Smarba"(Visual Basic)

null (C#)

Nothing (Visual Basic)

{"Darb","Smarba"}

分隔符的每个元素定义包含单个字符的单独分隔符。 如果separator自变量是null或不包含任何字符,该方法将空格视为分隔符。 由 Unicode 标准; 定义空白字符它们返回true如果它们传递给Char.IsWhiteSpace方法。

尽管的此重载的单个参数String.Split为字符数组,你可以调用它与单个字符,如以下示例所示。

using System;

public class Example
{
   public static void Main()
   {
      String value = "This is a short string.";
      Char delimiter = 's';
      String[] substrings = value.Split(delimiter);
      foreach (var substring in substrings)
         Console.WriteLine(substring);
   }
}
// The example displays the following output:
//     Thi
//      i
//      a
//     hort
//     tring.

因为separator参数用修饰ParamArrayAttribute属性,编译器将解释单个字符作为单个元素字符数组。 这不是其他用例String.Split重载,以包括separator参数,则必须显式传递这些重载为字符数组separator自变量。

Split(Char[])方法提取由一个或多个中的字符分隔此字符串中子字符串 separator数组中,然后将这些子字符串作为数组的元素返回。

Split(Char[])方法执行使用区分大小写的序号排序规则的比较,从而查找分隔符。 有关 word、 字符串和顺序排序的详细信息,请参阅System.Globalization.CompareOptions枚举。

Split方法并不总是中断为多个子字符串分隔的字符串的最佳方式。 如果你不想要提取所有的子字符串的分隔的字符串,或者如果你想要分析基于模式而不是一组分隔符字符的字符串,请考虑以下替代方法。

如果您的字符串符合的固定模式,可以使用正则表达式提取和处理它们的元素。 例如,如果字符串采用以下形式"操作数"可以使用正则表达式提取和处理字符串的元素。 以下是一个示例:

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      String[] expressions = { "16 + 21", "31 * 3", "28 / 3",
                               "42 - 18", "12 * 7",
                               "2, 4, 6, 8" };
      String pattern = @"(\d+)\s+([-+*/])\s+(\d+)";
      foreach (var expression in expressions)
         foreach (Match m in Regex.Matches(expression, pattern)) {
            int value1 = Int32.Parse(m.Groups[1].Value);
            int value2 = Int32.Parse(m.Groups[3].Value);
            switch (m.Groups[2].Value)
            {
               case "+":
                  Console.WriteLine("{0} = {1}", m.Value, value1 + value2);
                  break;
               case "-":
                  Console.WriteLine("{0} = {1}", m.Value, value1 - value2);
                  break;
               case "*":
                  Console.WriteLine("{0} = {1}", m.Value, value1 * value2);
                  break;
               case "/":
                  Console.WriteLine("{0} = {1:N2}", m.Value, value1 / value2);
                  break;
            }
         }
   }
}
// The example displays the following output:
//       16 + 21 = 37
//       31 * 3 = 93
//       28 / 3 = 9.33
//       42 - 18 = 24
//       12 * 7 = 84

正则表达式模式(\d+)\s+([-+*/])\s+(\d+)定义如下︰

模式

描述

(\d+)

匹配一个或多个十进制数字。 这是第一个捕获组。

\s+

匹配一个或多个空格字符。

([-+*/])

匹配一个算术运算符符号 (+、-,*,或 /)。 这是第二个捕获组。

\s+

匹配一个或多个空格字符。

(\d+)

匹配一个或多个十进制数字。 这是第三个捕获组。

正则表达式还可用于从基于一种模式,而不是一组固定的字符的字符串提取子字符串。 这些条件之一发生时,这是一种常见方案︰

  • 一个或多个分隔符字符不始终用作分隔符中String实例。

  • 序列和分隔符字符的数量是变量或未知。

例如,Split方法无法用于拆分以下字符串,因为数\n(在 C# 中) 或vbCrLf(在 Visual Basic) 字符是变量,并且它们始终不能作为分隔符。


[This is captured\ntext.]\n\n[\n[This is more captured text.]\n]
\n[Some more captured text:\n   Option1\n   Option2][Terse text.] 

正则表达式可以轻松地,如以下示例所示拆分此字符串。

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      String input = "[This is captured\ntext.]\n\n[\n" +
                     "[This is more captured text.]\n]\n" +
                     "[Some more captured text:\n   Option1" +
                     "\n   Option2][Terse text.]";
      String pattern = @"\[([^\[\]]+)\]";
      int ctr = 0;
      foreach (Match m in Regex.Matches(input, pattern))
         Console.WriteLine("{0}: {1}", ++ctr, m.Groups[1].Value);
   }
}
// The example displays the following output:
//       1: This is captured
//       text.
//       2: This is more captured text.
//       3: Some more captured text:
//          Option1
//          Option2
//       4: Terse text.

正则表达式模式\[([^\[\]]+)\]定义如下︰

模式

说明

\[

匹配左括号。

([^\[\]]+)

匹配任何字符都不大括号或右括号一个或多个时间。 这是第一个捕获组。

\]

匹配右括号。

Regex.Split方法是几乎与String.Split,只不过它将拆分基于正则表达式模式而不是固定的字符集的字符串。 例如,下面的示例使用Regex.Split方法包含由连字符和其他字符的各种组合分隔的子字符串将字符串拆分。

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      String input = "abacus -- alabaster - * - atrium -+- " +
                     "any -*- actual - + - armoir - - alarm";
      String pattern = @"\s-\s?[+*]?\s?-\s";
      String[] elements = Regex.Split(input, pattern);
      foreach (var element in elements)
         Console.WriteLine(element);
   }
}
// The example displays the following output:
//       abacus
//       alabaster
//       atrium
//       any
//       actual
//       armoir
//       alarm

正则表达式模式\s-\s?[+*]?\s?-\s定义如下︰

模式

描述

\s-

匹配连字符后跟一个空白字符。

\s?

匹配零个或一个空白字符。

[+*]?

匹配零个或一个匹配项的 + 或 * 字符。

\s?

匹配零个或一个空白字符。

-\s

匹配连字符后跟空白字符。

如果你不感兴趣所有字符串中子字符串,你可能希望使用一个返回匹配的开始的索引的字符串比较方法。 然后,你可以调用Substring方法以提取所需的子字符串。 字符串比较方法包括︰

  • IndexOf它返回的字符串实例的字符或字符串的第一个匹配项的从零开始索引。

  • IndexOfAny它返回的字符数组中的任意字符的第一个匹配项的当前的字符串实例中的从零开始的索引。

  • LastIndexOf它返回的字符串实例的字符或字符串的最后一个匹配项的从零开始索引。

  • LastIndexOfAny它返回的字符数组中的任意字符的最后一个匹配项的当前的字符串实例中的从零开始的索引。

下面的示例使用IndexOf方法以查找在字符串的时间段。 然后,它使用Substring方法以返回完整的句子。

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      String value = "This is the first sentence in a string. " +
                     "More sentences will follow. For example, " +
                     "this is the third sentence. This is the " +
                     "fourth. And this is the fifth and final " +
                     "sentence.";
      var sentences = new List<String>();
      int position = 0;
      int start = 0;
      // Extract sentences from the string.
      do {
         position = value.IndexOf('.', start);
         if (position >= 0) {
            sentences.Add(value.Substring(start, position - start + 1).Trim());
            start = position + 1;
         }
      } while (position > 0);

      // Display the sentences.
      foreach (var sentence in sentences)
         Console.WriteLine(sentence);
   }
}
// The example displays the following output:
//       This is the first sentence in a string.
//       More sentences will follow.
//       For example, this is the third sentence.
//       This is the fourth.
//       And this is the fifth and final sentence.

Split方法返回的数组对象分配内存和String每个数组元素的对象。 如果你的应用程序需要最佳性能,或你的应用程序管理内存分配至关重要,请考虑使用IndexOfIndexOfAny方法。 你还可以选择使用Compare方法来查找字符串中的子字符串。

若要在分隔符字符将字符串拆分,使用IndexOfIndexOfAny方法来查找字符串中的分隔符。 若要在分隔符字符串将字符串拆分,使用IndexOfIndexOfAny方法来查找分隔符字符串的第一个字符。 然后使用Compare方法来确定该第一个字符后面的字符是否为等于其余的字符的分隔符字符串。

此外,如果组相同的字符用于拆分中存在多个字符串Split方法调用,请考虑创建一个数组,并在每个方法调用中引用它。 从而大幅减少每个方法调用的其他系统开销。

调用函数说明:

在.NET Framework 3.5和早期版本中,如果Split方法传递separatornull或不包含任何字符,该方法使用略有不同的一组字符比字符串拆分Trim方法执行来修整字符串。 在.NET Framework 4,这两种方法使用相同的一组 Unicode 空白字符。

下面的示例演示如何通过将视为分隔符的空格和标点符号的文本块从提取各个单词。 字符数组传递给separator参数String.Split(Char[])方法组成一个空格字符和一个 tab 字符,以及一些常用标点符号。

using System;

public class SplitTest {
    public static void Main() {

        string words = "This is a list of words, with: a bit of punctuation" +
                       "\tand a tab character.";

        string [] split = words.Split(new Char [] {' ', ',', '.', ':', '\t' });

        foreach (string s in split) {

            if (s.Trim() != "")
                Console.WriteLine(s);
        }
    }
}
// The example displays the following output to the console:
//       This
//       is
//       a
//       list
//       of
//       words
//       with
//       a
//       bit
//       of
//       punctuation
//       and
//       a
//       tab
//       character

通用 Windows 平台
自 8 起可用
.NET Framework
自 1.1 起可用
可移植类库
可移植 .NET 平台 中受支持
Silverlight
自 2.0 起可用
Windows Phone Silverlight
自 7.0 起可用
Windows Phone
自 8.1 起可用
返回页首
显示: