Разделить строку на другую строку в C #

683

Я использовал Split()метод для разделения строк, но это работает, только если вы разделяете строку по символу. Есть ли способ разделить string, с другой строкой, являющейся параметром разделения по?

Я попытался преобразовать сплиттер в массив символов, но безуспешно.

Другими словами, я хотел бы разделить string:

THExxQUICKxxBROWNxxFOX

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

БЫСТРО, КОРИЧНЕВЫЙ, ЛИС

Brandon
источник
2
Что касается будущих проблем: один из приведенных ниже комментариев меня заинтересовал, поэтому я решил начать обсуждение разработки программного обеспечения относительно неинтуитивного (но правильного) способа сделать это в принятом ответе.
шарет

Ответы:

1240

Чтобы разделить строку, вам нужно использовать перегрузку массива строк .

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);
Адам Робинсон
источник
4
Я фактически закончил тем, что изменил свой ответ на это по двум причинам: # 1: Чтобы обработать разбиения, которые я хочу сделать, мне нужно было бы использовать Regex.Escape, потому что моя разделенная строка часто будет содержать звездочки и т. Д. # 2: Хотя эта программа Я пишу, что не нуждается в реальной оптимизации, кажется, есть дополнительные издержки, связанные с использованием метода Regex Split.
Брэндон
7
@Peter: В этом посте Джон предлагает это, потому что у плаката нет фиксированного разделителя; он ищет разделить строки, разделенные «более чем одним пробелом» (что означает 2+). Для строк, ограниченных шаблоном, а не значением , RegEx - отличный (ну, единственный ) вариант. Для фиксаторов с фиксированными значениями это приводит к ненужным накладным расходам. Попробуйте запустить тест; по мере увеличения числа операций RegEx в конечном итоге занимает примерно 10x столько же, сколько и соответствующий string.Split.
Адам Робинсон
9
Я пришел из Python в C #. Python поддерживает строку, разделенную на другую строку. И мне часто нужно возвращаться к этому вопросу для простого ответа string[] Split(string pattern), который является наиболее естественным использованием, которое я мог придумать, но его там нет. Я написал C раньше, поэтому я привык к массивам символов, но я все еще не хочу видеть char[]всплывающее окно в коде C #, потому что это внезапно перетаскивает мое внимание с уровня потока на уровень байтов. Кто-нибудь знает, почему ребята из библиотеки C # разработали такой метод Split? Если есть веская причина, я могу попытаться оценить это, несмотря на неудобства.
foresightyj
11
Этот фрагмент занимает очень высокое место в списке вещей, которые мне было бы стыдно показывать разработчикам не на C #.
Traubenfuchs
99
Почему, черт возьми, мы не можем просто сделать data.Split("xx")?
mcont
122

Существует перегрузка Split, которая принимает строки.

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

Вы можете использовать любой из этих StringSplitOptions

  • None - возвращаемое значение включает элементы массива, которые содержат пустую строку
  • RemoveEmptyEntries - возвращаемое значение не включает элементы массива, которые содержат пустую строку

Таким образом, если строка "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.Noneвернет пустую запись в массиве для части "xxxx", пока StringSplitOptions.RemoveEmptyEntriesне будет.

Greg
источник
73
Regex.Split(string, "xx")

это способ, которым я делаю это обычно.


Конечно, вам нужно:

using System.Text.RegularExpressions;

или :

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

но опять же, мне нужна эта библиотека все время.

Питер
источник
13
@Brandon: Хотя я обычно предостерегаю от преждевременной оптимизации, вы должны знать, что RegEx.Splita немного дороже, чем простое 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для поддержки нескольких разделителей.
Мэтью Строубридж
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: Потому что это ужасный хак.
Overv
3
Работает нормально, но это опасно для универсальных методов
Kaizonaro
5
Публикация объяснений типа «Это ужасный взлом» или «плохой ответ» не поможет. Это просто мнение без объяснения причин. Вместо этого указывается что-то вроде «Нет необходимости одновременно сканировать строку на предмет замен и затем сканировать разделенные символы, поскольку это приводит к снижению производительности». был бы лучший способ объяснить себя. Слишком много программистов действуют таким образом. :(
Мэтт Руве
1
Что, если строка уже содержит |символ, по этой причине я думаю, что его опасно использовать.
драмы
-1

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

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
user890255
источник
1
Но это также раскололось бы "THExQUICK"там, где мы не хотим, чтобы оно
раскололось
Спасибо, Рафалон: да, Грег - лучший ответ: data.Split (новая строка [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
user890255
-4

Самый простой способ - использовать String.Replace:

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

Или проще:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");
user3458227
источник
3
Как таковой, он не будет возвращать массив (как требует вопрос), а просто строку с запятыми, где они xxбыли.
Arj
И не только потому, что если строка содержит дополнительные запятые, вы не сможете правильно разделить слова.
user3658298