Frage

Hier ist der Eingang (html, nicht xml):

... html content ...
<tag1> content for tag 1 </tag1>
<tag2> content for tag 2 </tag2>
<tag3> content for tag 3 </tag3>
... html content ...

Ich möchte 3 Spiele bekommen, die jeweils mit zwei Gruppen. Erste Gruppe würde den Namen des Tags enthalten und die zweite Gruppe den inneren Text des Tags enthalten würde. Es gibt nur diese drei Tags, so brauchen sie nicht universell sein.

Mit anderen Worten:

match.Groups["name"] would be "tag1"
match.Groups["value"] would be "content for tag 2"

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich sehe nicht, warum Sie Match Gruppennamen für das verwenden möchten.

Hier ist ein regulärer Ausdruck, die Tag-Namen und Tag-Inhalt in nummerierte Teilübereinstimmungen entsprechen würde.

<(tag1|tag2|tag3)>(.*?)</$1>

Hier ist eine Variante mit .NET Stil Gruppennamen

<(?'name'tag1|tag2|tag3)>(?'value'.*?)</\k'name'>.

EDIT

RegEx angepasst gemäß Frage des Autors Klarstellung.

Andere Tipps

Regex dafür könnte sein:

/<([^>]+)>([^<]+)<\/\1>/

Aber es ist allgemein als ich weiß nicht viel über die Flucht machanism von .NET. Übersetzen sie:

  • ersten Gruppenspiele der ersten Tag-Namen zwischen
  • zweite Gruppe entspricht den Inhalt (von> auf den nächst <
  • das Ende prüfen, ob der erste Tag geschlossen ist

HTH

Danke alle, aber keiner der Regexes Arbeit. :( Vielleicht war ich nicht spezifisch genug, sorry für die hier ist die genaue html versuche ich zu analysieren.

...some html content <b> etc </b> ...
<user> hello <b>mitch</b> </user>
...some html content <b> etc </b> ...
<message> some html <i>message</i> <a href....>bla</a> </message>
...some html content <b> etc </b> ...

Ich hoffe, dass es jetzt klarer ist. Ich bin nach USER und MESSAGE-Tags.

Ich brauche zwei Spiele zu bekommen, die jeweils mit zwei Gruppen. Erste Gruppe wpould geben mir Tag-Namen (Benutzer oder Nachricht) und die zweite Gruppe mir gesamte innere Text des Tags geben würde.

Ist die eigentlichen Daten xml, oder sieht es aus wie es?

Wenn es html ist, dann ist die HTML Agility Pack- wert Untersuchung ist - stellt dies eine DOM ( ähnlich wie XmlDocument), dass Sie die Daten abfragen können:

string input = @"<html>...some html content <b> etc </b> ...
<user> hello <b>mitch</b> </user>
...some html content <b> etc </b> ...
<message> some html <i>message</i> <a href....>bla</a> </message>
...some html content <b> etc </b> ...</html>";

            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(input);
            foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//user | //message"))
            {
                Console.WriteLine("{0}: {1}", node.Name, node.InnerText);
                // or node.InnerHtml to keep the formatting within the content
            }

Diese Ausgänge:

user:  hello mitch
message:  some html message bla

Wenn Sie die Formatierungs-Tags wollen, dann verwenden .InnerHtml statt .InnerText.

Wenn es xml ist, dann mit dem vollen Spektrum von XML zu kodieren, wäre es besser, einen XML-Parser zu verwenden. Für kleinen bis mittelgroßen xml, wäre schön, es in einen DOM wie XmlDocument Laden - dann die Knoten abfragen (zB „// *“). Für große xml, XmlReader könnte eine Option sein.

Wenn die Daten müssen nicht über die volle xml Sorge, dann einige einfache regex sollte nicht zu kompliziert sein ... ein vereinfachtes Beispiel (keine Attribute, keine Namensräume, keine verschachtelten xml) könnte sein:

string input = @"blah <tag1> content for tag 1 </tag1> blop
<tag2> content for tag 2 </tag2> bloop
<tag3> content for tag 3 </tag3> blip";

        const string pattern = @"<(\w+)>\s*([^<>]*)\s*</(\1)>";
        Console.WriteLine(Regex.IsMatch(input, pattern));
        foreach(Match match in Regex.Matches(input, pattern)) {
            Console.WriteLine("{0}: {1}", match.Groups[1], match.Groups[2]);
        }

Das Problem war, dass die ([^ <] *) Menschen wurden unter Verwendung von Dingen innerhalb der Tags entsprechen wurden die Öffnung passende

Hier ist eine etwas robustere Version von Tomalak regex so dass für Attribute und Leerzeichen:

Regex tagRegex = new Regex(@"<\s*(?<tag>" + string.Join("|", tags) + @")[^>]*>(?<content>.*?)<\s*/\s*\k<tag>\s*>", RegexOptions.IgnoreCase);

Natürlich, wenn Sie immer nur einen bestimmten Satz von Tags verwenden, gehen müssen Sie die

können ersetzen
string.Joing("|", tags)

mit der fest codierten Rohr Liste von Tags getrennt.

Einschränkungen der regex sind, dass, wenn Sie einen Tag haben Sie versuchen, in einer anderen verschachtelt Spiel wird es nur das äußere Tag entsprechen. d.

  

abc def ghi

Es wird die äußere Benutzer Tag entsprechen, aber nicht die innere Message-Tag.

Sie funktioniert auch nicht> 's in Attribute zitiert wie folgt:

  

Es wird nur passen

  

wird ein Teil des Tags zufrieden sein.

Dies wird Ihnen genannt Einfanggruppen für das, was Sie wollen. Es wird nicht für verschachtelte Tags arbeiten, aber.

/<(?<name>[^>]+)>(?<value>[^<]+)</\1>/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top