C # разделить строку другой строкой

422

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

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

THExxQUICKxxBROWNxxFOX

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

THE, QUICK, BROWN, FOX

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

8 ответов

730
Лучший ответ

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

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);
  • 4
    Я фактически закончил тем, что изменил свой ответ на это по двум причинам: # 1: Чтобы обработать разбиения, которые я хочу сделать, мне нужно было бы использовать Regex.Escape, потому что моя разделенная строка часто будет содержать звездочки и т. Д. # 2: Хотя эта программа Я пишу, что не нуждается в реальной оптимизации, есть дополнительные издержки, связанные с использованием метода Regex Split.
  • 1
    В мою защиту Джон Скит предложил где-то использовать Regex при разбиении строк на строки в качестве разделителя, и я должен признать, что когда он предлагает sth. Я склонен полагать, что это редко плохой совет. («Хотя, скорее всего, вы хотите разделить по строке, а не по символу, в этом случае вы захотите посмотреть на Regex.Split»)
Показать ещё 11 комментариев
87

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

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

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

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

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

  • 2
    Вам не нужно указывать строку после нового: "THExxQUICKxxBROWNxxFOX".Split(new[] { "xx" }, StringSplitOptions.None); буду работать.
  • 2
    Исправлено, спасибо. Старый код был старым.
47
Regex.Split(string,"xx")

- это то, как я обычно это делаю. Конечно, вам понадобится

using System.Text.RegularExpressions;

но снова мне нужно, чтобы lib все время.

  • 9
    @ Брэндон: Хотя я обычно предостерегаю от преждевременной оптимизации, вы должны знать, что RegEx.Split немного дороже, чем простой String.Split из-за накладных расходов регулярного выражения.
  • 7
    Если вы хотите разбить на произвольную строку, Regex.Escape используйте Regex.Escape для строки, это Regex.Escape любые метасимволы regex.
Показать ещё 1 комментарий
33

Здесь есть перегрузка String.Split:

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);
  • 1
    Единственный ответ, который удаляет ненужное объявление типа массива.
15

Мне нравится использовать для этого собственное расширение:

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 пока не включила этот метод: по крайней мере, одна компания, над которой я работала, использовала такое расширение во всех своих проектах на С#.

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

  • 2
    В качестве альтернативы используйте params string[] splitter в качестве второго параметра и измените new[] {splitter} на splitter для поддержки нескольких разделителей.
4
string data = "THExxQUICKxxBROWNxxFOX";

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

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

  • 2
    @ MasoudHosseini: Пожалуйста, прочитайте полный ответ; Там уже отказ от ответственности.
  • 2
    @kobe: Потому что это ужасный взлом.
Показать ещё 5 комментариев
3

Вышеуказанные ответы правильны. Я делаю еще один шаг и делаю С# для меня, определяя метод расширения в String:

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

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

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

Или проще:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню