2012-04-01 11 views
3

Ich habe so etwas in meinem Code.Extract alle Vorkommen von bestimmten Zeichen aus Strings

mystring.Split(new[]{"/","*"}, StringSplitOptions.RemoveEmptyEntries); 

aber was ich will eigentlich ist mystring in zwei Reihen zu trennen, eine der getrennten Elemente oben, und das andere Array, das die Trennzeichen oben in der Reihenfolge, wie sie in der Zeichenfolge erscheinen zu halten.

Ich könnte .IndexOf verwenden, um die Suche fortzusetzen, bis ich alle extrahieren, aber irgendwie denke ich, dass dies redundant sein wird. Gibt es eine Möglichkeit, dies in .NET zu tun? Wenn möglich, möchte ich LINQ vermeiden.

Danke.

+0

Gibt es einen Grund, warum Sie wollen LINQ vermeiden? –

+0

Ich dachte, dass das Ergebnis von Split ein Array mit den Elementen in der Reihenfolge ist, in der sie angezeigt werden. Kannst du erklären, willst du weiter? –

+0

Ziel-Framework ist .NET 2 –

Antwort

4

Etwas wie:

var separators = new char[] { '/', '*' }; 
var words = new List<string>(); 
var delimiters = new List<string>(); 
var idx = source.IndexOfAny(separators); 
var prevIdx = 0; 
while (idx > -1) 
{ 
    if (idx - prevIdx > 0) 
     words.Add(source.Substring(prevIdx, idx - prevIdx)); 

    prevIdx = idx + 1; 
    delimiters.Add(source.Substring(idx, 1)); 
    idx = source.IndexOfAny(separators, idx + 1); 
} 
+0

Ich musste eigentlich 'words.Add (VT.Substring (prevIdx)) hinzufügen;' Danke. –

0

Sie könnten einen Regex-Ausdruck mit benannten Gruppen in Betracht ziehen. Versuchen Sie eine geschachtelte benannte Gruppe. Das Äußere beinhaltet das Erfassen des Trennzeichens und das Innere erfasst nur den Inhalt.

0

Da Sie laufen in .NET 2.0, ich würde sagen, mit IndexOf ist einer der direkteste Art und Weise das Problem zu lösen:

public static int CountOccurences(string input, string pattern) 
{ 
    int count = 0; 
    int i = 0; 

    while (i = input.IndexOf(pattern, i) != -1) 
     count++; 
    return count; 
} 

Die Lösung Rob Smyth würde auch funktionieren schon sagt, aber Ich finde das am einfachsten und verständlichsten.

+0

Danke für Ihre Mühe. aber ich suchte eigentlich nicht nach dem Grafen. –

2

Wenn ich den Fragesteller richtig verstehe, will er die tatsächlichen getrennten Elemente sowie die Trennzeichen.

Ich denke, der folgende Code funktioniert:

 List<string> SeparatedItems = new List<string>(); 
     List<string> Delimiters = new List<string>(); 

     string sTestString = "mytest/string*isthis**and not/this"; 

     string sSeparatedItemString = String.Empty; 
     foreach(char c in sTestString) { 

      if(c == '/' || c == '*') { 

       Delimiters.Add(c.ToString()); 
       if(sSeparatedItemString != String.Empty) { 

        SeparatedItems.Add(sSeparatedItemString); 
        sSeparatedItemString = String.Empty; 
       } 
      } 
      else { 

       sSeparatedItemString += c.ToString();  
      } 

     } 

     if(sSeparatedItemString != String.Empty) { 

      SeparatedItems.Add(sSeparatedItemString); 
     } 
+0

Gute Arbeit. Ihr Ansatz ist nett, wird aber für eine große Eingabe ziemlich langsam sein. –

1

Try this:

var items = new List<string>(); 
var delimiters = new List<string>(); 
items.AddRange(Regex.Split(text, @"(?<=/)|(?=/)|(?<=\*)|(?=\*)")); 

for (int i = 0; i < items.Count;) 
{ 
    string item = items[i]; 
    if (item == "*" || item == "/") 
    { 
     delimiters.Add(item); 
     items.RemoveAt(i); 
    } 
    else if (item == "") 
    { 
     items.RemoveAt(i); 
    } 
    else 
    { 
     i++; 
    } 
} 
Verwandte Themen