Ho sviluppato un'espressione regolare che corrisponde alle specifiche della pagina pstops. (Spazio bianco Regex non significativo)Con gruppi nidificati denominati in un'espressione regolare, è possibile navigare nella gerarchia?
^(?:(?<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)"
Come puoi vedere, ci sono sottogruppi nidificati. A pagespec
non è necessario specificare rotation
, ad esempio. Vorrei essere in grado di fare qualcosa per l'effetto di questo:
If match.Groups("pages").Captures(0).Groups("pagespecs").Captures(1).Groups("rotation").Value > ""
ma naturalmente Captures
ha alcuna proprietà Groups
. C'è un modo per accedere ai sottogruppi nella gerarchia in questo modo?
EDIT: Ecco un esempio più minmal (spazio bianco significativa questa volta):
(?<paragraph>(?:(?<sentence>The (?<child>boy|girl) is hungry\.|The (?<parent>mother|father) is angry\.)\s*)+)
confrontati con questa stringa:
The boy is hungry. The mother is angry. The girl is hungry.
produce una sola partita. All'interno di questa corrispondenza,
Groups("paragraph")
ha una cattura corrispondente all'intera stringa.Groups("sentence")
ha tre catture.Groups("child")
ha due acquisizioni,boy
egirl
.Groups("parent")
ha una cattura,mother
.
Ma non c'è nulla che mi dice che il singolo di acquisizione per parent
si trova all'interno della seconda acquisizione per sentence
, a meno che non mi metto guardando Index
e Length
per ogni cattura.
EDIT: Ecco la risposta finale:
^(?:(?<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>)
)+
Questo spinge un NULL
sul pagespec
pila tra ogni page
, in modo che possono essere correlati con page
; e uno NULL
su ciascuno degli altri stack con nome tra ciascuno pagespec
. Gee, l'analisi è difficile ...
Suppongo che sarebbe utile per l'utilità della domanda se si riducesse a un esempio minimo. Qualcosa come la corrispondenza di 'xy @ z' con' (? :(? (? :(? [az]) | -) + | @) + 'probabilmente farebbe (come in, come faccio a sapere se' Gruppi ("sub"). Captures (1) 'appartiene a' Groups ("part"). Cattura (0) 'o' (1) '). Ma grande domanda, sarei interessato anche a una soluzione :). –