Es fällt mir schwer, eine gute Ressource zu finden, die erklärt, wie benannte Erfassungsgruppen in C # verwendet werden. Dies ist der Code, den ich bisher habe:
string page = Encoding.ASCII.GetString(bytePage);
Regex qariRegex = new Regex("<td><a href=\"(?<link>.*?)\">(?<name>.*?)</a></td>");
MatchCollection mc = qariRegex.Matches(page);
CaptureCollection cc = mc[0].Captures;
MessageBox.Show(cc[0].ToString());
Dies zeigt jedoch immer nur die vollständige Zeile:
<td><a href="/path/to/file">Name of File</a></td>
Ich habe mit mehreren anderen "Methoden" experimentiert, die ich auf verschiedenen Websites gefunden habe, aber ich erhalte immer das gleiche Ergebnis.
Wie kann ich auf die benannten Erfassungsgruppen zugreifen, die in meinem regulären Ausdruck angegeben sind?
<>
wird diese beschädigt . Sie können(?'link'.*)
stattdessen in diesem Fall verwenden. Nicht ganz relevant für diese Frage, aber ich bin hier von einer Google-Suche nach ".net<>
wird es nicht brechen. Ich konnte diemyRegex.GetGroupNames()
Sammlung als XML-Elementnamen verwenden.Antworten:
Verwenden Sie die Gruppensammlung des Match-Objekts und indizieren Sie es mit dem Namen der Erfassungsgruppe, z
quelle
var m
, da das ein wäreobject
.Sie geben die benannte Erfassungsgruppenzeichenfolge an, indem Sie sie an den Indexer der
Groups
Eigenschaft eines resultierendenMatch
Objekts übergeben.Hier ist ein kleines Beispiel:
quelle
Das folgende Codebeispiel entspricht dem Muster auch bei Leerzeichen dazwischen. dh:
ebenso gut wie:
Die Methode gibt true oder false zurück, je nachdem, ob die eingegebene htmlTd-Zeichenfolge mit dem Muster übereinstimmt oder nicht. Wenn es übereinstimmt, enthalten die out-Parameter den Link bzw. den Namen.
Ich habe dies getestet und es funktioniert richtig.
quelle
${1}
um die Dinge noch einfacher zu halten.Wenn jemand einen Anwendungsfall hat, in dem er Gruppennamen benötigt, bevor er eine Suche nach einem Regex-Objekt ausführt, kann er Folgendes verwenden:
quelle
Diese Antwort verbessert die Antwort von Rashmi Pandit , die in gewisser Weise besser ist als die anderen, da sie das genaue Problem, das in der Frage aufgeführt ist, vollständig zu lösen scheint.
Der schlechte Teil ist, dass es ineffizient ist und die IgnoreCase-Option nicht konsistent verwendet.
Ein ineffizienter Teil ist, dass die Erstellung und Ausführung von Regex teuer sein kann und in dieser Antwort nur einmal erstellt werden konnte (beim Aufrufen
Regex.IsMatch
wurde die Regex nur hinter den Kulissen erneut erstellt). UndMatch
Methode nur einmal aufgerufen worden sein könnte und in einer Variablen gespeichert und dannlink
undname
rufen Sie sollteResult
von diesen Variablen.Die Option IgnoreCase wurde nur im
Match
Teil verwendet, nicht jedoch imRegex.IsMatch
Teil.Ich habe auch die Regex-Definition außerhalb der Methode verschoben, um sie nur einmal zu erstellen (ich denke, dies ist der sinnvolle Ansatz, wenn wir die Assembly mit der
RegexOptions.Compiled
Option speichern ).quelle