Нумерация регулярных выражений - PullRequest
2 голосов
/ 18 сентября 2008

Есть ли каноническое упорядочение выражений субматчей в регулярном выражение?

Например: каков порядок совпадений в
«(([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 ]

4 голосов
/ 18 сентября 2008

Они, как правило, нумеруются в том порядке, в котором начинаются сборы, слева направо. Поэтому вариант б.

2 голосов
/ 18 сентября 2008

В регулярных выражениях Perl 5 ответ b верен. Субматчевые группировки хранятся в порядке открытых скобок.

Многие другие движки регулярных выражений берут свои подсказки от Perl, но вам придется искать отдельные реализации, чтобы быть уверенным. Я бы предложил книгу Освоение регулярных выражений для более глубокого понимания.

0 голосов
/ 18 сентября 2008

Вы считаете открывающие скобки слева направо. Таким образом, заказ будет

(([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. Другие движки регулярных выражений могут иметь другие правила.

...