我开发了一个匹配
pstops页面规范的正则表达式. (正则表达式空白不重要.)
^(?:(?\d+):)?
(?
(?
(?-?\d+)
(?[RUL]?)?
(?:@(?\d*(?:\.\d+)))?
(?:\(
(?\d*\.?\d+)(?in|cm|w|h)?,(?\d*\.?\d+)(?in|cm|w|h)?
\))?
\+?)+,?
)+$
.
'Sample string:
'"4:1L@.7(21cm,0)+-2L@.7(21cm,14.85cm),1L(21cm,14.85cm)"
如您所见,有嵌套的命名子组.例如,pagespec不需要指定旋转.我希望能够做到这一点:
If match.Groups("pages").Captures(0).Groups("pagespecs").Captures(1).Groups("rotation").Value > ""
但当然Captures没有Groups属性.有没有办法以这种方式访问层次结构中的子组?
编辑:这是一个更简单的例子(这次重要的空白区域):
(?(?:(?The (?boy|girl) is hungry\.|The (?mother|father) is angry\.)\s*)+)
与此字符串匹配:
The boy is hungry. The mother is angry. The girl is hungry.
产生一场比赛.在那场比赛中,
>组(“段落”)有一个匹配整个字符串的捕获.
>组(“句子”)有三个捕获.
>团体(“孩子”)有两个捕获,男孩和女孩.
>团体(“父母”)有一个捕获,母亲.
但没有什么可以告诉我父母的单一捕获位于第二次捕获的句子内,除非我开始查看每次捕获的索引和长度.
编辑:这是最终的答案:
^(?:(?\d+):)?
(?
(?
(?-?\d+)
(?[RUL]?)
(?:@(?\d*(?:\.\d+)))?
(?:\(
(?\d*\.?\d+)(?in|cm|w|h)?,(?\d*\.?\d+)(?in|cm|w|h)?
\))?
(?)(?)(?)(?)(?)(?)(?)
\+?)+,?
(?)
)+
这会将NULL推送到每个页面之间的pagespec堆栈上,因此它们可以与页面相关联;每个pagespec之间的每个其他命名堆栈上都有一个NULL.哎呀,解析很难……