Laden...

RegEx mit mehreren Ergebnissen

Erstellt von the_weird vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.689 Views
T
the_weird Themenstarter:in
64 Beiträge seit 2005
vor 14 Jahren
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

193 Beiträge seit 2006
vor 14 Jahren

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

Gruß Jake

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo the_weird,

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

herbivore

T
the_weird Themenstarter:in
64 Beiträge seit 2005
vor 14 Jahren

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

1.361 Beiträge seit 2007
vor 14 Jahren

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

T
the_weird Themenstarter:in
64 Beiträge seit 2005
vor 14 Jahren

@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 😦.

T
the_weird Themenstarter:in
64 Beiträge seit 2005
vor 14 Jahren

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>
49.485 Beiträge seit 2005
vor 14 Jahren

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

T
the_weird Themenstarter:in
64 Beiträge seit 2005
vor 14 Jahren

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? 🤔

49.485 Beiträge seit 2005
vor 14 Jahren

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

T
the_weird Themenstarter:in
64 Beiträge seit 2005
vor 14 Jahren

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? 🤔

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo the_weird,

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

herbivore

T
the_weird Themenstarter:in
64 Beiträge seit 2005
vor 14 Jahren

*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.