Нумерация регулярных выражений

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

Например: каков порядок совпадений в
"(([0-9]{3}).([0-9]{3}).([0-9]{3}).([0-9]{3}))\ S +([ А-Я]+)"?

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 ответа

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

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

Другие вопросы по тегам