Нумерация регулярных выражений
Есть ли каноническое упорядочение выражений субматчей в регулярном выражении?
Например: каков порядок совпадений в
"(([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. Другие движки регулярных выражений могут иметь другие правила.