Ich habe eine Regex entwickelt, die pstops Seitenspezifikationen entspricht. (Regex-Leerzeichen nicht signifikant.)Mit geschachtelten benannten Gruppen in einer Regex, möglich, Hierarchie zu navigieren?
^(?:(?<modulo>\d+):)?
(?<pages>
(?<pagespec>
(?<pageno>-?\d+)
(?<rotation>[RUL]?)?
(?:@(?<scale>\d*(?:\.\d+)))?
(?:\(
(?<xoff>\d*\.?\d+)(?<xunit>in|cm|w|h)?
,
(?<yoff>\d*\.?\d+)(?<yunit>in|cm|w|h)?
\))?
\+?)+,?
)+$
.
'Sample string:
'"4:[email protected](21cm,0)[email protected](21cm,14.85cm),1L(21cm,0)[email protected](21cm,14.85cm)"
Wie Sie sehen können, gibt es verschachtelte benannte Untergruppen. A pagespec
muss zum Beispiel nicht rotation
angeben. Ich möchte in der Lage sein, etwas zu der Wirkung, dies zu tun:
If match.Groups("pages").Captures(0).Groups("pagespecs").Captures(1).Groups("rotation").Value > ""
aber natürlich Captures
hat keine Groups
Eigenschaft. Gibt es eine Möglichkeit, auf diese Weise auf Untergruppen in der Hierarchie zuzugreifen?
EDIT: Hier ist ein minmal Beispiel (Leerraum signifikant diesmal):
(?<paragraph>(?:(?<sentence>The (?<child>boy|girl) is hungry\.|The (?<parent>mother|father) is angry\.)\s*)+)
gegen diese Saite Matched:
The boy is hungry. The mother is angry. The girl is hungry.
ein Spiel erzeugt. Innerhalb dieses Matches
Groups("paragraph")
hat eine Erfassung, die die gesamte Zeichenfolge abdeckt.Groups("sentence")
hat drei Aufnahmen.Groups("child")
hat zwei Aufnahmen,boy
undgirl
.Groups("parent")
hat eine Aufnahme,mother
.
Aber es gibt nichts, das mir sagt, dass die Einzelerfassung für parent
für sentence
innerhalb der zweiten Erfassung liegt, es sei denn, ich Index
und Length
für jede Aufnahme beginnen suchen.
EDIT: Hier ist die endgültige Antwort:
^(?:(?<modulo>\d+):)?
(?<pages>
(?<pagespec>
(?<pageno>-?\d+)
(?<rotation>[RUL]?)
(?:@(?<scale>\d*(?:\.\d+)))?
(?:\(
(?<xoff>\d*\.?\d+)(?<xunit>in|cm|w|h)?
,
(?<yoff>\d*\.?\d+)(?<yunit>in|cm|w|h)?
\))?
(?<pageno>)(?<rotation>)(?<scale>)(?<xoff>)(?<xunit>)(?<yoff>)(?<yunit>)
\+?)+,?
(?<pagespec>)
)+
Dies drückt einen NULL
auf den pagespec
Stapel zwischen den einzelnen page
, so können sie mit page
korreliert werden; und ein NULL
auf jedem der anderen genannten Stacks zwischen jedem pagespec
. Gee, Parsing ist schwer ...
Ich denke, es wäre hilfreich für die Nützlichkeit der Frage, wenn Sie dies auf ein minimales Beispiel reduziert haben. Etwas wie das Zusammenpassen von 'xy @ z' mit' (? :(? (? :(? [az]) | -) + | @) + 'würde wahrscheinlich tun (wie in, wie weiß ich, ob' Gruppen ("sub"). Captures (1) 'gehört zu' Groups ("part"). Captures (0) 'oder' (1) '). Aber gute Frage, ich wäre auch an einer Lösung interessiert :). –