Número geral de grupos de captura em expressões regulares do PHP

Vamos considerar a seguinte situação. Suponha que temos uma variável com um ano, que pode variar de 1990 a 2099. Suponha que queremos obter os dois últimos dígitos do ano em um grupo de captura. Vamos escrever a expressão regular correspondente:

php<?php
  $reg = '#19(9\d)|20(\d\d)#';
?>

No entanto, há uma inconveniência nos aguardando aqui. O problema é que, para os anos do século passado, os dois dígitos cairão no primeiro grupo de captura, enquanto para os anos do século seguinte - no segundo. Vamos ver com exemplos.

Aqui está a primeira variante:

php<?php
  $str = '1991';
  preg_match($reg, $str, $res);
  var_dump($res); // [1 => '91']
?>

E aqui está a segunda variante:

php<?php
  $str = '2021';
  preg_match($reg, $str, $res);
  var_dump($res); // [2 => '21']
?>

Suponha agora que queremos salvar os dígitos encontrados do ano em uma variável. Temos um problema, pois não sabemos exatamente com qual chave recuperar os dados do grupo de captura:

php<?php
  $year = $res[1]; // precisa da chave 1 ou 2
?>

É possível resolver o problema com uma condição:

php<?php
  if (!empty($res[1])){
    $year = $res[1];
  } else{
    $year = $res[2];
  }
?>

No entanto, existe uma solução mais simples. Podemos usar um comando especial (?| ). Todos os grupos de captura que estiverem dentro dele terão o mesmo número.

Vamos corrigir nossa expressão regular

php<?php
  $reg = '#(?|19(9\d)|20(\d\d))#';
?>

E agora nosso ano certamente estará no grupo de captura número um:

php<?php
  $year = $res[1];
?>
Задание 1

São dadas strings com datas, nas quais o ano pode variar de 1990 a 2099:

php<?php
  $arr = [
    '31-12-2025',
    '30-11-1995',
    '29-10-1990',
  ];
?>

Para cada data, coloque o dia no primeiro grupo de captura, o mês no segundo, e os dois últimos dígitos do ano - no terceiro.