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


683

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

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

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

THExxQUICKxxBROWNxxFOX

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

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


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не будет.


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);

1
Но это также раскололось бы "THExQUICK"там, где мы не хотим, чтобы оно
— раскололось

Спасибо, Рафалон: да, Грег - лучший ответ: data.Split (новая строка [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
— user890255

-4

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

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

Или проще:

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

3
Как таковой, он не будет возвращать массив (как требует вопрос), а просто строку с запятыми, где они xxбыли.
— Arj

И не только потому, что если строка содержит дополнительные запятые, вы не сможете правильно разделить слова.
— user3658298
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.