2016-12-14 4 views
0

Split-String durch List: I SplitColl mit Trennzeichen haben:Split String von List

xx 
yy 
.. 
.. 

Und Zeichenfolge wie folgt:

strxx 

Wenn ich versuche, String aufgeteilt:

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

Ich habe "str" ​​Ergebnis; Aber wie kann man dieses Ergebnis überspringen? Ich möchte in diesem Fall ein leeres Array erhalten (wenn delal ein Teil eines Wortes ist). Ich erwarte, dass, wenn formattedText="str xx", Ergebnis ist str.

EDIT: Ich habe eine Vielzahl von Delimetern Adresse: wie street,city,town, etc. Und ich versuche, Strings wie zu bekommen: city DC -> DC. Aber wenn ich ein Wort wie: cityacdc -> bekomme ich acdc, aber es ist kein Name einer Stadt.

+0

Sie können die Liste nur gesetzt Trennzeichen wie 'lst.Add (" xx "); lst.Add ("xx"); ' – Innat3

+0

" Ich erwarte, dass, wenn 'formatiertText =" str xx "', das Ergebnis "str" ​​ist. In diesem Fall ist dein Delimeter tatsächlich * space *. Was Sie suchen, ist ein Übereinstimmungskriterium –

+0

"Stadt DC-> DC" Möchten Sie den Teil hinter dem Schlüsselwort oder vor wie in Ihrem ersten Beispiel erhalten? "Ich erwarte, dass, wenn formatiert Text =" str xx ", Ergebnis ist str" –

Antwort

1

Probieren Sie es aus, was ich zuerst mache, ist, dass ich zuerst alle führenden oder tailing Trennzeichen (nur wenn sie durch ein Leerzeichen getrennt sind) aus der formatedText Zeichenfolge entfernen. Dann benutze ich die verbleibende Zeichenfolge, die ich für jedes Trennzeichen aufspalte, wenn es auf beiden Seiten Leerzeichen enthält.

//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

Es scheint, dass Sie Ihre Schlüsselwörter nicht wirklich als Trennzeichen verwenden, sondern als Suchkriterium. In diesem Fall können Sie RegEx verwenden, um nach jedem Muster zu suchen. Hier ist ein Beispielprogramm dieses Verfahren zu veranschaulichen:

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

Dieser diesen Fall behandeln würde:

Und ich versuche Strings zu erhalten wie: Stadt DC -> DC

zu Behandeln Sie den Fall, in dem Sie das Wort vor Ihrem Schlüsselwort finden möchten:

Ich erwarte, dass wenn formatiertText = „Str xx“ ist Ergebnis str

schalten nur die Orte des Anpassungskriterium:

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

und nimmt das erste Element auf dem geteilten

results.Add(s.Split(' ')[0]);