String.Split только на первый разделитель в C #? - PullRequest
76 голосов
/ 07 января 2010

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

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

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

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

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

Ответы [ 4 ]

137 голосов
/ 07 января 2010

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

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();
13 голосов
/ 07 января 2010

В приведенном выше примере вы можете разделить на ":" (то есть двоеточие с завершающим пробелом), так как это похоже на то, что вы сделали. Если бы вы действительно разбили только первый разделитель, вы бы увидели начальный пробел во втором элементе массива.

Тем не менее, вы, вероятно, должны посмотреть на эту перегрузку Split ...

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

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

... который позволяет указать максимальное количество подстрок.

3 голосов
/ 07 января 2010
?("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"
1 голос
/ 10 октября 2013

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

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