Как разделить строку многосимвольным разделителем в C #?


232

Что если я хочу разделить строку, используя разделитель, который является словом?

Например, This is a sentence.

Я хочу разделить isи получить Thisи a sentence.

В Java, я могу отправить в строке в качестве разделителя, но как я могу сделать это в C#?

Ответы:


281

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Пример из документов:

string source = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] {"[stop]"};
string[] result;

// ...
result = source.Split(stringSeparators, StringSplitOptions.None);

foreach (string s in result)
{
    Console.Write("'{0}' ", String.IsNullOrEmpty(s) ? "<>" : s);
}

7
Это фактически возвращает: 'Th' '' 'предложение' с примером, приведенным в вопросе. Возможно, это то, что он на самом деле хочет, но это не то, что он указал.
IRBMe

6
Это просто пример ... Дело в том, что есть String.Split, который принимает строки в качестве разделителей.
Бруно Конде

1
Да, но он не делает то, что указывает вопрос. Вы должны использовать что-то более умное, чтобы получить заданный результат. Теперь, является ли заданный вопрос действительно тем, чего хочет спрашивающий, - это другой вопрос, но на заданный здесь вопрос нельзя ответить тривиально с помощью только String.Split.
IRBMe

3
Все еще не совсем работает. Если вы включите пробелы в слово для разделения, они не будут включены в вывод. Если вы посмотрите на пример, приведенный в вопросе, вы заметите, что они действительно включают пробелы. Разделение на «есть» даст вам «Это» и «предложение», а не «Это» и «предложение». Обратите внимание на тонкие пробелы в конце «This» и начале «предложения». Опять же, этот ответ, вероятно, то, что на самом деле хочет спрашивающий, но это не то, что он спросил, и, я повторяю, String.Split не решит его тривиально.
IRBMe

2
@IRBMe ты прочитал вопрос? «Я хочу разделить на« есть ». Так что я получу «Это» и «предложение» ». Видите пробелы в результатах ??? Это именно то, что делает Сплит.
Bruno Conde

55

Вы можете использовать метод Regex.Split , что-то вроде этого:

Regex regex = new Regex(@"\bis\b");
string[] substrings = regex.Split("This is a sentence");

foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

Изменить : это удовлетворяет пример, который вы дали. Обратите внимание, что обычный String.Split также разделяется на « is » в конце слова «This», поэтому я использовал метод Regex и включил границы слова вокруг « is ». Обратите внимание, однако, что если вы просто написали этот пример по ошибке, то String.Split , вероятно, будет достаточно.


@ РЕДАКТИРОВАТЬ: я тоже не был уверен, но вы все еще можете использовать обычное разбиение строки и просто пробел с обеих сторон, если его цель состоит только в том, чтобы удалить слово «is».
ahawker

1
Это тоже не работает (по крайней мере, не без особых усилий), потому что вы не знаете, должно ли место идти слева, справа или в обоих случаях, не зная позиций слова, которое было разбито на строку ,
IRBMe

Кажется слишком сложным, так как String.Splity позволяет вам уже разбивать строку ...
Ed S.

3
Я уже говорил об этом в своем редактировании моего ответа, в комментарии выше и в 3 комментариях к другому ответу. String.Split не работает для примера, приведенного в вопросе. Я не собираюсь повторяться, объясняя почему. Вы можете прочитать все другие комментарии, если хотите знать.
IRBMe

обратите внимание, что метод разделения регулярных выражений не удаляет предварительный разделитель и конечный разделитель для переменной ... :(
melaos

34

Основываясь на существующих ответах на этот пост, это упростит реализацию :)

namespace System
{
    public static class BaseTypesExtensions
    {
        /// <summary>
        /// Just a simple wrapper to simplify the process of splitting a string using another string as a separator
        /// </summary>
        /// <param name="s"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static string[] Split(this string s, string separator)
        {
            return s.Split(new string[] { separator }, StringSplitOptions.None);
        }


    }
}

9
+1, это кричит о методе расширения. Почти глупо, что это не одна из встроенных перегрузок.
Тодд Меньер,

9
@ToddMenier Что значит "почти"?
mwardm

28
string s = "This is a sentence.";
string[] res = s.Split(new string[]{ " is " }, StringSplitOptions.None);

for(int i=0; i<res.length; i++)
    Console.Write(res[i]);

РЕДАКТИРОВАТЬ: «is» дополняется с обеих сторон пробелами в массиве, чтобы сохранить тот факт, что вы хотите , чтобы только слово «is» было удалено из предложения, а слово «this» осталось без изменений.



5

Вы можете использовать String.Replace (), чтобы заменить желаемую строку разделения символом, которого нет в строке, а затем использовать String.Split для этого символа, чтобы разделить результирующую строку для того же эффекта.


5

Или используйте этот код; (то же самое: новая строка [])

.Split(new[] { "Test Test" }, StringSplitOptions.None)

3

Вот функция расширения для выполнения разделения с помощью разделителя строк:

public static string[] Split(this string value, string seperator)
{
    return value.Split(new string[] { seperator }, StringSplitOptions.None);
}

Пример использования:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");

0
var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in

-5
string strData = "This is much easier"
int intDelimiterIndx = strData.IndexOf("is");
int intDelimiterLength = "is".Length;
str1 = strData.Substring(0, intDelimiterIndx);
str2 = strData.Substring(intDelimiterIndx + intDelimiterLength, strData.Length - (intDelimiterIndx + intDelimiterLength));

19
Прежде чем публиковать код, вам, вероятно, следует сначала попробовать запустить его через компилятор, если только вы не обозначите, что у вас его нет. В первой строке отсутствует точка с запятой, а str1 и str2 не определены. Не говоря уже о том, что код на самом деле не работает так, как хотел ОП. Этот код разбивает его на "Th" и "намного проще".
Мандреко
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.