String.Split только на первом разделителе в С#?

String.Split удобен для разбиения строки на несколько частей на разделителе.

Как мне перейти к разделению строки только на первом разделителе. Например. У меня есть строка

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

И я бы хотел, чтобы массив выглядел как

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

Ответ 1

Наилучший подход немного зависит от того, насколько гибким должен быть синтаксический анализ, в отношении возможных дополнительных пространств и тому подобного. Проверьте точные спецификации формата, чтобы узнать, что вам нужно.

yourString.Split(new char[] { ':' }, 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();

Ответ 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"

Ответ 4

Я принял вариант ответа Торарина выше, Нижеследующее должно быть в состоянии справиться с вашим требованием, а также обрезать пробелы.

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