Розділити рядок на інший рядок у C #


682

Я використовував Split()метод для розділення рядків, але це, здається, працює лише в тому випадку, якщо ви розділяєте рядок за символом. Чи є спосіб розділити a string, при цьому інший рядок буде розділений за параметром?

Я спробував перетворити сплітер у символьний масив, не пощастивши.

Іншими словами, я хотів би розділити string:

THExxQUICKxxBROWNxxFOX

by xxі повернути масив зі значеннями:

THE, HITK, BROWN, FOX


2
Для майбутніх проблем: Мене зацікавив один із наведених нижче коментарів, тому я вирішив відкрити дискусію щодо інженерії програмного забезпечення щодо неінтуїтивного (але правильного) способу зробити це у прийнятій відповіді.
scharette

Відповіді:


1239

Для того, щоб розділити на рядок, вам доведеться використовувати перевантаження рядкових рядків .

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);

4
Я фактично змінив свою відповідь на це з 2 причин: # 1: Для обробки розщеплень, які я хочу зробити, мені потрібно використовувати Regex.Escape, тому що мій розділений рядок часто містить зірочки тощо. # 2: Хоча ця програма Я пишу, що не потребує реальної оптимізації, але, можливо, є додаткові накладні витрати з використанням методу Regex Split.
Брендон

7
@Peter: У цій публікації Джон пропонує це, оскільки на плакаті немає фіксованого роздільника; він шукає розділити рядки, розділені на "більше одного пробілу" (мається на увазі 2+). Для рядків, обмежених шаблоном, а не значенням , RegEx - це чудовий (ну єдиний ) варіант. Для роздільників з фіксованою вартістю це не потребує накладних витрат. Спробуйте запустити тест; Коли кількість операцій збільшується, RegEx закінчується десь біля ~ 10x до тих пір, як відповідні string.Split.
Адам Робінсон

9
Я приїжджаю з Python на C #. Python підтримує розділений рядок на інший рядок. І мені часто потрібно повертатися до цього питання, щоб отримати просту відповідь string[] Split(string pattern), що є найбільш природним способом використання, який я міг би придумати, але його там немає. Раніше я писав C, тому я звик до масивів char, але я все одно не люблю бачити, що char[]з'являється код C #, оскільки він раптом притягує мою увагу від рівня потоку до рівня байтів. Хтось знає, чому хлопці з бібліотеки C # розробили такий метод розділення? Якщо є вагомі причини, я, мабуть, можу спробувати оцінити це, незважаючи на незручності.
foresightyj

11
Цей фрагмент займає дуже високе місце у списку речей, за які я соромлюсь показувати розробникам, які не входять у C #.
Traubenfuchs

99
Чому чорт не можемо просто зробити data.Split("xx")?
mcont

122

Існує перевантаження Спліт, яка займає рядки.

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

Ви можете використовувати будь-який із цих StringSplitOptions

  • Ні - значення, що повертається, включає елементи масиву, що містять порожній рядок
  • RemoveEmptyEntries - повернене значення не включає елементів масиву, що містять порожній рядок

Отже, якщо рядок "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.Noneповерне порожній запис у масиві для частини "xxxx", поки StringSplitOptions.RemoveEmptyEntriesне буде.


73
Regex.Split(string, "xx")

це те, як я це роблю зазвичай.


Звичайно, вам знадобиться:

using System.Text.RegularExpressions;

або:

System.Text.RegularExpressions.Regex.Split(string, "xx")

але потім мені знову потрібна ця бібліотека.


13
@Brandon: Хоча я зазвичай застерігаю від передчасної оптимізації, ви повинні мати на увазі, що a RegEx.Split- це зовсім трохи дорожче, ніж простий String.Splitчерез регулярні накладні вирази.
Адам Робінсон

9
Якщо ви хочете розділити на довільну рядок, Regex.Escapeспочатку використовуйте рядок, це дозволить уникнути будь-яких мета-символів регулярних виразів.
Річард

Однією з ключових переваг, яка може платити за накладні витрати, є можливість встановити параметри порівняння рядків
Тимур Садыков,

47

Для цього існує перевантаження String.Split :

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);

1
Єдина відповідь, яка видаляє непотрібне оголошення типу масиву.
wonea

25

Як правило, я хочу використовувати для цього своє розширення:

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 


//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

Це, однак, призведе до винятку, якщо Microsoft вирішить включити цей метод перевантаження у більш пізні версії. Це також ймовірна причина, чому Microsoft тим часом не включила цей метод: Принаймні одна компанія, над якою я працював, використовувала таке розширення у всіх своїх проектах C #.

Також можливо умовно визначити метод під час виконання, якщо він не існує.


4
Як альтернативи, використовувати в params string[] splitterякості другого параметра і змін , new[] {splitter}щоб splitterпідтримувати кілька роздільників.
Matthew Strawbridge

10

Попередні відповіді вірні. Я йду на крок далі і змушую C # працювати на мене, визначаючи метод розширення на String:

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

Таким чином я можу назвати це на будь-якій струні простим способом, який я наївно очікував, коли я спробував це зробити:

"a big long string with stuff to split on".Split("g str");


7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

Просто обережно виберіть символ заміни (виберіть той, який, ймовірно, не присутній у рядку)!


2
@MasoudHosseini: Прочитайте повну відповідь; вже є відмова від відповідальності.
SNag

3
@kobe: Тому що це жахливий злом.
Оверв

3
Працює чудово, але це небезпечно для загальних методів
Kaizonaro

5
Розміщення пояснень на кшталт "Це жахливий злом" або "погана відповідь" не корисні. Це просто думка без пояснень. Натомість, заявивши щось на зразок "Не зайвим буде сканувати рядок на заміну, а потім сканувати розділені символи, оскільки це призводить до низької продуктивності". був би кращий спосіб пояснити себе. Занадто багато програмістів діють таким чином. :(
Метт Рууе

1
Що робити, якщо рядок вже містить |char, тому я вважаю, що це небезпечно використовувати.
amd

-1

Це також легко:

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

1
Але це також розділиться "THExQUICK"там, де ми не хочемо, щоб його
розкололи

Дякую Рафалону: так, Грег - найкраща відповідь: data.Split (нова рядок [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
користувач890255

-4

Найпростіший спосіб - це використовувати String.Replace:

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

Або простіше:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");

3
Як це є, це не поверне масив (як запитує питання), а лише рядок з комами, де xxбули.
Арж

І не тільки те, що якби рядок містив додаткові коми, ви не змогли б правильно розділити слова.
користувач3658298
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.