Как разделить строку, чтобы в конце результата остались разделители?

У меня есть несколько разделителей. Например {дел1, дел2, дел3}. Предположим, у меня есть текст: Text1 del1 text2 del2 text3 del3

Я хочу разделить строку таким образом:

  1. Текст1 дел1
  2. текст2 дел2
  3. текст3 del3

Мне нужно получить массив строк, когда каждый элемент массива является texti deli. Как я могу сделать это на С#?


person Aram Gevorgyan    schedule 20.03.2012    source источник
comment
Не могли бы вы уточнить, каков будет ожидаемый результат при разбиении Text1 del1 text2 del2 text3 del3?   -  person Strillo    schedule 20.03.2012
comment
@Strillo, я редактирую. Теперь понятно?   -  person Aram Gevorgyan    schedule 20.03.2012


Ответы (5)


String.Split позволяет использовать несколько разделенных разделителей. Я не знаю, подходит ли это к вашему вопросу.

Пример :

    String text = "Test;Test1:Test2#Test3";
    var split = text.Split(';', ':', '#');
   //split contains an array of "Test", "Test1", "Test2", "Test3"

Изменить: вы можете использовать регулярное выражение для сохранения разделителей.

 String text = "Test;Test1:Test2#Test3";
 var split = Regex.Split(text, @"(?<=[;:#])");
 // contains "Test;", "Test1:", "Test2#","Test3"
person Alex    schedule 20.03.2012
comment
@Alex: Спасибо, это именно то, что я хочу. - person Aram Gevorgyan; 20.03.2012

Это должно помочь:

    const string input = "text1-text2;text3-text4-text5;text6--";
    const string matcher= "(-|;)";

    string[] substrings = Regex.Split(input, matcher); 

    StringBuilder builder = new StringBuilder();
    foreach (string entry in substrings)
    {
        builder.Append(entry);
    }

    Console.Out.WriteLine(builder.ToString());

обратите внимание, что вы получите пустые строки в своем массиве подстрок для совпадений для двух «-» в конце, вы можете игнорировать или делать с этими значениями то, что вам нравится.

person krystan honour    schedule 20.03.2012
comment
Мне нужно получить массив строк, когда каждый элемент массива является texti deli. - person Aram Gevorgyan; 20.03.2012

Вы можете использовать регулярное выражение. Для такой строки, как "text1;text2|text3^", вы можете использовать это:

(.*;|.*\||.*\^)

Просто добавьте больше альтернативных шаблонов для каждого разделителя.

person Matt Burland    schedule 20.03.2012
comment
Мне нужно получить массив строк, когда каждый элемент массива является texti deli. - person Aram Gevorgyan; 20.03.2012

Если вы хотите сохранить разделитель при разделении строки, вы можете использовать следующее:

string[] delimiters = { "del1", "del2", "del3" };

string input = "text1del1text2del2text3del3";
string[] parts = input.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);

for(int index = 0; index < parts.Length; index++)
{
    string part = parts[index];
    string temp = input.Substring(input.IndexOf(part) + part.Length);

    foreach (string delimter in delimiters)
    {
        if ( temp.IndexOf(delimter) == 0)
        {
            parts[index] += delimter;
            break;
        }
    }
}

parts тогда будет:

    [0] "text1del1" 
    [1] "text2del2" 
    [2] "text3del3" 
person Wouter de Kort♦    schedule 20.03.2012
comment
Как он отметил, у него НЕСКОЛЬКО разных разделителей. Ваш код не будет работать - person archil; 20.03.2012
comment
Я думаю, что они говорят о разделении строки с несколькими разными разделителями и сохранении разделителя для этого разделения. Ваше решение этого не сделает. т.е. если у них есть text1;text2|text3^, они хотят получить text1;,text2|,text3^ - person Matt Burland; 20.03.2012
comment
@Wouter de Kort Спасибо, но вы пишете, когда у меня есть один разделитель. А что делать, если у меня несколько разделителей? - person Aram Gevorgyan; 20.03.2012
comment
Я отредактировал свой ответ, чтобы поддерживать несколько разделителей. Вы можете использовать это или решение Regex :) - person Wouter de Kort♦; 20.03.2012
comment
@Wouter de Kort: Спасибо, я попробую. - person Aram Gevorgyan; 20.03.2012

Как предложил @Matt Burland, используйте Regex

List<string> values = new List<string>();
string s = "abc123;def456-hijk,";

Regex r = new Regex(@"(.*;|.*-|.*,)");
foreach(Match m in r.Matches(s))
   values.Add(m.Value);
person Strillo    schedule 20.03.2012