Feedback

C# - Ein Paar von Strings finden

Veröffentlicht von am 24.11.2013
(0 Bewertungen)
Mithilfe dieser Methode kann man in einer Zeichenfolge ein Paar finden.

Beispiel
String: "Obst (Äpfel (und Birnen))"
Wir wollen wissen was in den Klammern steht (Äpfel (und Birnen)). Mit dem normeln IndexOf würden wir die erste schließende und nicht die zweite finden.
Mithilfe meiner Methode ist das aber möglich:
string n = "Obst (Äpfel (und Birnen))";
int index1 = n.IndexOf("(");
int index2 = n.IndexOfPair(index1, "(", ")");
string obst = n.Substring(index1 + 1, index2 - index1 - 1);
        /// <summary>
        /// Findet den Index einer Zeichenfolge nachdem die erste Zeichenfolge so oft gefunden wurde wie die zweite Zeichenfolge.
        /// </summary>
        /// <param name="s">Die zu durchsuchende Zeichenfolge.</param>
        /// <param name="index">Der Index ab dem gesucht werden soll.</param>
        /// <param name="key1">Die erste Zeichenfolge. Zu jedem Vorkommen muss es ein entsprechendes Vorkommen von <paramref name="key2"/> geben.</param>
        /// <param name="key2">Die zweite Zeichenfolge. Der Index des letzten Paares mit <paramref name="key"/> wird zurück gegeben.</param>
        /// <returns>Der Index von <paramref name="key2"/> vom letzten Paar aus <paramref name="key1"/> und <paramref name="key2"/>.</returns>
        public static int IndexOfPair(this string s, int index, string key1, string key2)
        {
            if (index >= s.Length) return -1;//Index zu hoch
            int count = 0;
            int index1 = s.IndexOf(key1, index), index2 = s.IndexOf(key2, index);
            if (index1 == -1) return -2;//Kein Startelement
            if (index2 == -1) return -3;//Kein Endelement
            if (index1 > index2) return -1;//Endelement steht vor dem ersten Startelement
            do
            {
                index1 = s.IndexOf(key1, index);
                index2 = s.IndexOf(key2, index);
                if (index1 < index2 && index1 != -1)//Start- oder Endelement das nächste?
                {
                    ++count;
                    index = index1 + 1;
                }
                else
                {
                    --count;
                    index = index2 + 1;
                }

                if (index1 == -1 && index2 == -1)//Kein vollständiges Paar gefunden
                    return -4;
            }
            while (count > 0);//Solange wie die Zahlen nicht passen
            return index2;
        }

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!