Üldine taskute arv regulaaravaldistes PHP-s

Vaatleme järgmist olukorda. Oletame, et meil on muutuja aastaga, mis võib muutuda alates 1990 kuni 2099. Oletame, et tahame saada aasta kahte viimast numbrit taskusse. Kirjutame vastava regulaaravaldise:

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

Siiski ootab meid siin üks ebamugavus. Asi on selles, et möödunud sajandi aastate puhul kaks numbrit satuvad esimesse taskusse, aga teise sajandi aastate puhul - teise. Vaatame näidetel.

Siin on esimene variant:

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

Ja siin on teine variant:

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

Oletame nüüd, et tahame leitud aasta numbrid kirjutada muutujasse. Meid ootab probleem, sest me ei tea täpselt, millise võtmega andmeid taskust võtta:

php<?php
  $year = $res[1]; // vaja võtit kas 1 või 2
?>

Probleemi saab lahendada tingimuslausega:

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

Siiski on olemas lihtsam lahendus. Saab kasutada spetsiaalset käsku (?| ). Kõik taskud, mis asuvad selle sees, saavad ühe numbri.

Parandame oma regulaaravaldist

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

Ja nüüd on meie aasta kindlasti taskus number üks:

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

Antud on stringid kuupäevadega, milles aasta võib muutuda alates 1990 kuni 2099:

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

Iga kuupäeva puhul pange päev esimesse taskusse, kuu teise, ja aasta kaks viimast numbrit - kolmandasse.