Regex mit nicht einfangender Gruppe in C #

8

Ich verwende die folgende Regex

%Vor%

bei der folgenden Art von Daten:

%Vor%

Die Idee besteht darin, zwei Gruppen zu extrahieren, von denen jede eine Zeile enthält (beginnend mit der Joint Number, 1, 2, usw.). Der C # -Code ist wie folgt:

%Vor%

Dies funktioniert jedoch nicht: Anstatt zwei erfasste Gruppen (die innere Gruppe) zurückzugeben, gibt es eine Gruppe zurück: den gesamten Block einschließlich der Spaltenüberschriften. Warum passiert das? Behandelt C # nicht erfasste Gruppen anders?

Schließlich sind RegExes der beste Weg, dies zu tun? (Ich habe wirklich das Gefühl, dass ich jetzt zwei Probleme habe.)

    
ian93 02.03.2013, 03:12
quelle

4 Antworten

8

mc[0].Captures entspricht mc[0].Groups[0].Captures . Groups[0] bezieht sich immer auf die gesamte Übereinstimmung, daher wird immer nur die eine Aufnahme zugeordnet. Der Teil, nach dem Sie suchen, wird in Gruppe 1 erfasst. Verwenden Sie daher mc[0].Groups[1].Captures .

Aber Ihre Regex wurde entwickelt, um die gesamte Eingabe in einem Versuch abzugleichen, so dass die Methode Matches() immer eine MatchCollection mit nur einer Übereinstimmung zurückgibt (vorausgesetzt, die Übereinstimmung ist erfolgreich). Sie können stattdessen auch Match() verwenden:

%Vor%

Ausgabe:

%Vor%     
Alan Moore 02.03.2013, 06:12
quelle
2

Ich würde einfach nicht Regex für schweres Heben und Parsen des Textes verwenden.

%Vor%

    
Romoku 02.03.2013 03:38
quelle
1

Warum nicht einfach die Werte erfassen und den Rest ignorieren? Hier ist eine Regex, die die Werte erhält.

%Vor%     
OmegaMan 02.03.2013 03:38
quelle
1

Es gibt zwei Probleme: Der sich wiederholende Teil (?:...) stimmt nicht richtig überein; und das .* ist gierig und verbraucht die gesamte Eingabe, so dass der sich wiederholende Teil niemals übereinstimmt, selbst wenn es möglich wäre.

Verwenden Sie stattdessen:

%Vor%

Dies hat einen nicht gierigen führenden Teil, stellt sicher, dass der Zeilenabgleich in einer neuen Zeile beginnt (nicht in der Mitte eines Titels) und verwendet [\r\n\s]* , falls die Zeilenumbrüche nicht genau so sind, wie Sie es erwarten.

Persönlich würde ich Regexes dafür verwenden, aber ich mag Regexes :-) Wenn Sie wissen, dass die Struktur des Strings immer [Titel] [Newline] [Zeilenumbruch] [Zeilen] sein wird, dann ist es vielleicht einfacher (wenn weniger flexibel), einfach auf Zeilenumbrüche aufzuteilen und entsprechend zu verarbeiten.

Schließlich können Sie regex101.com oder eine der vielen anderen Regex-Test-Sites verwenden, um Ihre regulären Ausdrücke zu debuggen.

    
Cameron 02.03.2013 03:22
quelle

Tags und Links