2012-03-20 4 views
2

У меня есть несколько разделителей. Например {del1, del2, del3}. Предположим, у меня есть текст: Текст1 del1 text2 del2 text3 del3Как разбить строку, разделители которой остаются в конце результата?

Я хочу, чтобы разбить строку таким образом:

  1. Текст1 del1
  2. text2 del2
  3. text3 del3

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

+0

Не могли бы вы уточнить, что будет ожидаемый результат при разбиении "Текст1 del1 text2 del2 text3 del3"? – Strillo

+0

@ Стрильо я редактирую. Теперь понятно? –

ответ

7

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

Пример:

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

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

String text = "Test;Test1:Test2#Test3"; 
var split = Regex.Split(text, @"(?<=[;:#])"); 
// contains "Test;", "Test1:", "Test2#","Test3" 
+0

@Alex: Спасибо, это именно то, что я хочу. –

1

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

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" 
+0

Как он отметил, у него НЕСКОЛЬКО, разные разделители. Ваш код не будет работать – archil

+0

Я * думаю * они говорят о разделении строки, содержащей несколько разных разделителей и сохраняющих разделитель для этого разделения. Вы не будете этого делать. То есть если они имеют «text1; text2 | text3 ^», они хотят получить «text1;», «text2 |», «text3 ^» –

+0

@Wouter de Kort Спасибо, но вы пишете, когда у меня есть один разделитель. И что делать, если у меня есть несколько разделителей? –

2

Это должно сделать трюк:

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

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

+0

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

1

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

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

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

+0

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

1

Как предположил Берланд @ Matt, использовать 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); 
+0

Спасибо, я понимаю. –

Смежные вопросы