String.Split 仅在 C# 中的第一个分隔符上?

Posted

技术标签:

【中文标题】String.Split 仅在 C# 中的第一个分隔符上?【英文标题】:String.Split only on first separator in C#? 【发布时间】:2010-01-07 11:05:29 【问题描述】:

String.Split 便于在分隔符上拆分多个部分的字符串。

我应该如何继续在第一个分隔符上拆分字符串。例如。我有一个字符串

"Time: 10:12:12\r\n"

我想要一个看起来像这样的数组

"Time","10:12:12\r\n"

【问题讨论】:

使用空格分割?并设置一个 arry = yourString.Split(' '); @RamgyBorja 除非他还从 Time 修剪 : 否则将无法工作,无论如何,不​​是问什么 @smurtagh 是的,为了安全编码使用修剪 【参考方案1】:

最好的方法在一定程度上取决于您希望解析的灵活性,以及​​可能的额外空格等。检查确切的格式规范,看看你需要什么。

yourString.Split(new char[]  ':' , 2)

将限制您两个 2 子字符串。但是,这不会修剪第二个字符串开头的空格。但是,您可以在拆分后的第二次操作中执行此操作。

yourString.Split(new char[]  ':', ' ' , 2,
    StringSplitOptions.RemoveEmptyEntries)

应该可以,但如果您尝试拆分包含空格的标题名称,则会中断。

yourString.Split(new string[]  ": " , 2,
    StringSplitOptions.None);

将完全按照您的描述进行,但实际上需要存在空间。

yourString.Split(new string[]  ": ", ":" , 2,
    StringSplitOptions.None);

使空格可选,但如果有多个空格,您仍然需要TrimStart()

为了保持格式的灵活性和代码的可读性,我建议使用第一个选项:

string[] split = yourString.Split(new char[]  ':' , 2);
// Optionally check split.Length here
split[1] = split[1].TrimStart();

【讨论】:

为什么不使用 (String[], Int32, StringSplitOptions) 重载? (msdn.microsoft.com/en-us/library/1bwe3zdy.aspx)。这仅适用于 .NET 2.0 及更高版本,但以下给出了 OP 要求的确切结果: yourString.Split(new string[] ": " , 2, StringSplitOptions.None) @Bernhof:确实如此。但是,我不确定如果字符串中有多余的空格(或没有空格)会发生什么。根据所需的行为,最佳方法会有所不同。 我觉得像 yourString.Split(':', 2); 这样的东西非常令人困惑。不起作用...感谢您的解释! .Select(s=> s.Trim()) 是我经常修剪拆分结果的方式【参考方案2】:

在上面的示例中,您可以拆分“:”(即带有尾随空格的冒号),因为这似乎是您所做的。如果你真的只在第一个分隔符上拆分,你会在第二个数组元素中看到一个前导空格。

但是,您可能应该看看 Split 的这种重载...

http://msdn.microsoft.com/en-us/library/c1bs0eda.aspx

public string[] Split(
  char[] separator,
  int count
)

...允许您指定最大子字符串数。

【讨论】:

【参考方案3】:
?("Time: 10:12:12\r\n").Split(new char[]  ':', ' ' , 2, 
   StringSplitOptions.RemoveEmptyEntries)
Dimensions:[2]
    [0]: "Time"
    [1]: "10:12:12\r\n"

其他选项:

?("Time: 10:12:12\r\n").Split(new char[]  ':' , 2)
Dimensions:[2]
    [0]: "Time"
    [1]: " 10:12:12\r\n"
?("Time: 10:12:12\r\n").Split(new char[]  ':' , 1)
Dimensions:[1]
    [0]: "Time: 10:12:12\r\n"
?("Time: 10:12:12\r\n").Split(new char[]  ':' , 3)
Dimensions:[3]
    [0]: "Time"
    [1]: " 10"
    [2]: "12:12\r\n"

【讨论】:

分隔符是冒号,不是空格。你是对的,在空间上分割会很好并给出 2 个元素,但我认为这不是要问的问题。【参考方案4】:

我采用了上述 Thorarin 回答的变体, 下面应该能够满足您的要求,加上修剪空格。

yourString.Split(new []'-',2).Select(s => s.Trim())

【讨论】:

以上是关于String.Split 仅在 C# 中的第一个分隔符上?的主要内容,如果未能解决你的问题,请参考以下文章

C#中的Split用法以及详解

C#判断某个字符串是否在另一个字符串数组中

C# String.split()用法小结。String.Split 方法 (String[],?StringSplitOptions)

System.String.Split(null) 不删除空格 (C#)

C#学习教程:LINQ to Entities无法识别方法’System.String Split(Char )’方法

Java string.split 与 C# Regex.split - 限制为一定数量的字段