Рядок. Розділити лише на першому роздільнику в C #?


78

String.Split зручно розділяти рядок з кількома частинами на роздільник.

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

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

І я хотів би мати масив, схожий на

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

розділити за допомогою пробілів? і встановіть arry = yourString.Split ('');
Ramgy Borja

1
@RamgyBorja, який не буде працювати, якщо він також не обріже :від Timeі в будь-якому випадку, а не те, про що просили
smurtagh

@smurtagh так, для безпечного кодування використовується обробка
Ramgy Borja

Відповіді:


146

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

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 (новий рядок [] {":"}, 2, StringSplitOptions.None)
bernhof

@Bernhof: так. Однак я не впевнений, що має статися у випадку зайвих пробілів (або відсутність пробілів) у рядку. Найкращий підхід дещо відрізняється залежно від бажаної поведінки.
Thorarin

2
Мені здається дуже заплутаним, що щось на зразок yourString.Split (':', 2); не працює ... Дякую за пояснення!
Себастьян,

1
.Select(s=> s.Trim())саме так я часто
обрізаю

14

У наведеному вище прикладі ви можете розділити ":" (тобто двокрапку з кінцевим пробілом), оскільки це, здається, те, що ви зробили. Якщо ви дійсно поділилися лише на перший деліметр, ви побачите провідний пробіл у другому елементі масиву.

Однак, мабуть, варто поглянути на це перевантаження Спліту ...

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 елементи, але я не думаю, що це питання.
Мартін Пек,

1

Я прийняв варіацію відповіді Тораріна вище: Нижче слід мати можливість обробляти ваші вимоги, а також обрізати пробіли.

yourString.Split(new []{'-'},2).Select(s => s.Trim())
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.