正则表达式子匹配编号

时间:2020-03-05 18:59:57  来源:igfitidea点击:

常规中子匹配表达式的规范排序吗
表达?

例如:子匹配的顺序是什么
"(([[[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.

解决方案

回答

它们通常按照捕获对象从左到右的顺序编号。因此,选项b。

回答

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

许多其他正则表达式引擎从Perl中获得了启发,但是我们必须确定单个实现才能确定。我建议读一本精通正则表达式的书,以加深理解。

回答

我们可以数出左括号,从左到右。所以命令是

(([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会做的。其他正则表达式引擎可能具有不同的规则。