2016-12-14 4 views
0

Разбивает строку по списку: У меня есть SplitColl с разделителями:Разбивает строка по списку

xx 
yy 
.. 
.. 

И строка так:

strxx 

Когда я пытаюсь разделить строку:

var formattedText = "strxx"; 
    var lst = new List<String>(); 
    lst.Add("xx"); 
    lst.Add("yy"); 
    var arr = formattedText.Split(lst.ToArray(), 10, StringSplitOptions.RemoveEmptyEntries); 

У меня есть результат "str"; Но как пропустить этот результат? Я хочу получить пустой массив в этом случае (когда delim является частью слова). ожидаем, что если formattedText="str xx", результат str.

EDIT: У меня есть много разметчиков адреса: таких как street,city,town и т. Д. И я пытаюсь получить строки вроде: city DC -> DC. Но, когда я получаю слово вроде: cityacdc -> я получаю acdc, но это не имя города.

+0

Вы можете просто задать список разделители типа 'lst.Add (« xx »); lst.Add ("xx"); ' – Innat3

+0

" Я ожидаю, что когда 'formattedText =" str xx "', результатом будет 'str'. В этом случае на самом деле ваш делимер * space *. То, что вы ищете, является критерием соответствия –

+0

«city DC-> DC» вы хотите получить часть ключевого слова или раньше, как в первом примере? «Я ожидаю, что когда formattedText =« str xx », результатом является str" –

ответ

1

Попробуйте, в основном, то, что я делаю, сначала я удаляю любые ограничивающие или ограничивающие ограничители (только если они разделены пробелом) из строки форматированного текста. Затем, используя оставшуюся строку, я разбиваю ее для каждого разделителя, если у него есть пробелы с обеих сторон.

//usage 
var result = FormatText(formattedText, delimiterlst); 


//code 
static string[] FormatText(string input, List<string> delimiters) 
{ 
    delimiters.ForEach(d => { 
     TrimInput(ref input, "start", d.ToCharArray()); 
     TrimInput(ref input, "end", d.ToCharArray()); 
    }); 
    return input.Split(delimiters.Select(d => $" {d} ").ToArray(), 10, StringSplitOptions.RemoveEmptyEntries); 
} 
static void TrimInput(ref string input, string pos, char[] delimiter) 
{ 
    //backup 
    string temp = input; 

    //trim 
    input = (pos == "start") ? input.TrimStart(delimiter) : input.TrimEnd(delimiter); 
    string trimmed = (pos == "start") ? input.TrimStart() : input.TrimEnd(); 

    //update string 
    input = (input != trimmed) ? trimmed : temp; 
} 
1

Похоже, что вы не используете свои ключевые слова как разделители, а как критерий поиска. В этом случае вы можете использовать RegEx для поиска каждого шаблона. Ниже приведен пример программы, чтобы проиллюстрировать эту процедуру:

static void Main(string[] args) 
{ 
    List<string> delim = new List<string> { "city", "street" }; 

    string formattedText = "strxx street BakerStreet cityxx city London"; 

    List<string> results = new List<string>(); 

    foreach (var del in delim) 
    { 
     string s = Regex.Match(formattedText, del + @"\s\w+\b").Value; 

     if (!String.IsNullOrWhiteSpace(s)) 
     { 
      results.Add(s.Split(' ')[1]); 
     } 
    }    

    Console.WriteLine(String.Join("\n", results)); 
    Console.ReadKey(); 
} 

Это будет обрабатывать этот случай:

И я пытаюсь получить строки как: город DC -> DC

в обрабатывать случай, когда вы хотите найти слово перед своим ключевым словом:

Я ожидаю, что при форматированииText = «Ул хх», результат ул

просто переключают места критерия соответствия:

string s = Regex.Match(formattedText, @"\b\w+\s"+ del).Value; 

и взять первый элемент в расколе

results.Add(s.Split(' ')[0]); 
Смежные вопросы