编号正则表达式子匹配

时间:2008-09-17 20:33:05

标签: regex tree-traversal linearization

规则中是否存在子匹配表达式的规范排序 表达?

例如:中的子匹配顺序是什么 “(([0-9] {3})。([0-9] {3})。([0-9] {3})。([0-9] {3}))\ S +([ AZ] +)“?

a. (([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{3}))\s+([A-Z]+)  
   (([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{3}))  
   ([A-Z]+)  
   ([0-9]{3})  
   ([0-9]{3})  
   ([0-9]{3})  
   ([0-9]{3})  

b. (([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{3}))\s+([A-Z]+)  
   (([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{3}))  
   ([0-9]{3})  
   ([0-9]{3})  
   ([0-9]{3})  
   ([0-9]{3})  
   ([A-Z]+)  

c. somthin' else. 

3 个答案:

答案 0 :(得分:4)

它们往往按照捕获的开始,从左到右的顺序编号。因此,选项b。

答案 1 :(得分:2)

在Perl 5正则表达式中,答案b是正确的。子匹配分组按开括号的顺序存储。

许多其他正则表达式引擎从Perl中获取提示,但您必须查找单个实现以确定。我建议将这本书Mastering Regular Expressions用于更深入的理解。

答案 2 :(得分:0)

从左到右计算左括号。所以订单将是

(([0-9]{3}).([0-9]{3}).([0-9]{3}).([0-9]{3}))
([0-9]{3})
([0-9]{3})
([0-9]{3})
([0-9]{3})
([A-Z]+)

至少这是Perl会做的事情。其他正则表达式引擎可能有不同的规则。