Laden...

RegEx mit mehreren Ergebnissen

Letzter Beitrag vor 14 Jahren 13 Posts 1.710 Views
RegEx mit mehreren Ergebnissen

Hallo,

wie ich aus einem String ein Ergebnis mit Regex.Match bekomme ist kein Problem und klar, aber wie mache ich das, wenn ich mehrere Ergebnisse erwarte?

(Ich habe einen HTML-Text, in welcher sich x-INPUT Felder befinden und ich will alle auslesen)

<INPUT type=hidden value=52140 name=input1234567890-12345-12344>
<INPUT type=hidden value=52141 name=input1234567890-12345-12345>
<INPUT type=hidden value=52142 name=input1234567890-12345-12346>

Ich will aus diesem Code einmal [variable_zahlN] und [wertN] auslesen.

Ich würde mich freuen, wenn Ihr mir dabei weiterhelfen könnten.

Danke im Voraus und noch ein angenehmes Wochenende

Schau dir doch mal Regex.Matches an.
Regex.Matches-Methode

Gruß Jake

Hallo the_weird,

oder eine Schleife - die man ja so oder so braucht - über Match.NextMatch.

herbivore

Inzwischen bekomme ich hier echt ... ich sitze jetzt seit 1 Monat an diesem besch... Problem! Zum Glück stze ich nicht die ganze Zeit daran, da ich noch ein paar externe Klassen benötigte, aber nun ist dies noch alles was fehlt und ich bekomme einfach kein Ergebnis zurück .... (muss ich beim auslesen aus HTML irgendetwas beachten, was es in normalen TXT-Dateien nicht gibt?)

Danke euch im Voraus

Hi the_weird,

was klappt denn nicht? Wo hängst du denn?

Mit den von Jake angesprochenen Matches und benannten Groups kannst du doch alles erreichen!?

In Anlehnung an
String der Form key1=value1;key2=value2;... in Dictionary&lt;string, string&gt; konvertieren?
hab ich mal folgendes Code-Snippet gebastelt.
Ich hoffe das hilft dir weiter.

Dictionary<string, string> dictionary =
          Regex.Matches(content, @"<input name=""text-(?<key>[^""]*)"" type=""hidden"" value=""(?<value>[^""]*)"" />")
          .OfType<Match>()
          .ToDictionary(match => match.Groups["key"].Value, 
                        match => match.Groups["value"].Value);

beste Grüße
zommi

@zommi
ich werde den Code in der Klasse jetzt noch einmal von vorne aufbauen und dein Codebeispiel verwenden.
Ich habe zur Zeit das Problem, dass wenn ich einen Text auslese alles funktioniert, und wenn ich den dann auf den HTML-Quellcode loslasse kommt gar nichts raus, außer den Debug-Informationen 😦.

So ... nun ist schon wieder ein Monat vergangen und ich blicke mit diesem RegEx immernoch nicht so ganz durch.

Einfache RegEx mit nur einem Ergebnis sind kein Problem, aber bei diesen MultiLine, ....

Ich habe diesen Code:

string regex = @"^<INPUT type=hidden value=(?<anz>\d+) name=input(?<nummer>\d{10}-\d{5}-\d{5})>$";
RegexOptions options = RegexOptions.Multiline;
string input = webBrowser1.Document.Body.InnerHtml;

MatchCollection matches = Regex.Matches(input,regex,options);
foreach (Match match in matches)
{
      this.richTextBox1.Text = this.richTextBox1.Text + "\nAusgabe\n->" + match.Value + "\n  Anz:" + match.Groups["anz"].Value + "\n  Nummer:" + match.Groups["nummer"].Value;
}

Kann mir vielleicht jemand von euch hier weiterhelfen? X( Der Text sieht wie folgt aus:

<INPUT type=hidden value=52141 name=input1234567890-12345-12345>

Hallo the_weird,

warum verwendest du über ^ und $? Du willst doch die Tags sicher überall finden, egal wo sie stehen. Wenn du aber ^ und $ weglässt, ist es auch egal, ob du Multiline verwendest oder nicht.

Und warum benutzt du überhaupt Regex, wenn du die Tags auch mit HtmlDocument.GetElementsByTagName bekommen kannst?

herbivore

Hallo herbivore,

danke für deine Antwort 🙂, jetzt verstehe ich auch,w arum ich bei einzel Suche was finden kann, aber bei mehrfach nicht :-p! Jetzt funktioniert es!!!!! 👍

Wegen dem GetElementsByTagName ist das Problem, dass zu jeder Zeit neue Einträge hinzu, bzw. wegfallen können. Somit blieb mir nur der Weg über das RegEx, oder? 🤔

Hallo the_weird,

wenn der HTML-Quelltext sich ändern kann, müsstest du doch auch mit Regex jedesmal neu suchen. Da kannst du genauso gut HtmlDocument.GetElementsByTagName neu aufrufen.

herbivore

Ich glaube ich stehe auf dem Schlauch 🙂.

Die Tags sehen doch wie folgt aus

input1234567890-12345-12345
input1234567890-12345-12346
input1234567890-12345-12347
input5468462132-00012-12224
inputxxxxxxxxxx-xxxxx-xxxxx

Dann müsste ich doch bei einer Änderung des Tag jedesmal den Code neu anpassen, damit er die neuen Inputfield sieht, oder würdest du das in eine Schleife hängen, wo ich alles hochzähle und somit prüfe ob es vorhanden ist oder nicht und wenn ja, welcher Wert enthalten ist? 🤔

Hallo the_weird,

GetElementsBy**_Tag_Name**. Der TagName ist immer INPUT. Du hast es wohl gar nicht ausprobiert.

herbivore

*arg*. Ich dachte immer, bei GetElementsBy muss ich genau den Namen kennen und wusste nicht, dass diese Logik auch fuzzy ist und ich somit alle Ergebnisse erhalte.

Ich werde das script mal umbauen und schauen, was schneller ist.