Tôi đã phát triển một regex phù hợp với thông số trang pstops. (Khoảng trống Regex không đáng kể.)Với các nhóm được đặt tên lồng nhau trong một regex, có thể điều hướng phân cấp?
^(?:(?<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)"
Như bạn có thể thấy, có các nhóm con được đặt tên lồng nhau. Ví dụ: pagespec
không cần chỉ định rotation
. Tôi muốn để có thể làm gì đó để tác dụng của việc này:
If match.Groups("pages").Captures(0).Groups("pagespecs").Captures(1).Groups("rotation").Value > ""
nhưng tất nhiên Captures
không có tài sản Groups
. Có cách nào để truy cập các phân nhóm trong hệ thống phân cấp theo cách này không?
EDIT: Dưới đây là một ví dụ minmal hơn (màu trắng không gian đáng kể thời gian này):
(?<paragraph>(?:(?<sentence>The (?<child>boy|girl) is hungry\.|The (?<parent>mother|father) is angry\.)\s*)+)
khớp với chuỗi này:
The boy is hungry. The mother is angry. The girl is hungry.
sản xuất một trận đấu. Trong trận đấu đó,
Groups("paragraph")
có một lần chụp phù hợp với toàn bộ chuỗi.Groups("sentence")
có ba ảnh chụp.Groups("child")
có hai ảnh chụp,boy
vàgirl
.Groups("parent")
có một ảnh chụp,mother
.
Nhưng không có gì mà nói với tôi rằng việc bắt giữ duy nhất cho parent
nằm trong chụp thứ hai cho sentence
, trừ khi tôi bắt đầu xem xét Index
và Length
cho từng chụp được.
EDIT: Dưới đây là câu trả lời cuối cùng:
^(?:(?<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>)
)+
này đẩy một NULL
vào pagespec
chồng giữa mỗi page
, vì vậy họ có thể tương quan với page
; và NULL
vào mỗi ngăn xếp có tên khác giữa mỗi pagespec
. Gee, phân tích cú pháp rất khó ...
Tôi đoán nó sẽ giúp ích cho câu hỏi nếu bạn giảm điều này xuống một ví dụ tối thiểu. Cái gì đó giống như 'xy @ z' với' (? :(? (? :(? [az]) | -) + | @) + 'có thể làm (như trong, làm cách nào để biết nếu' Nhóm (Captures (1) 'thuộc về' Groups ("part"). Captures (0) 'hoặc' (1) ') Nhưng câu hỏi hay, tôi cũng muốn được quan tâm đến một giải pháp :). –