หมายเลขรวมของกลุ่มจับใน Regular Expressions PHP

พิจารณาสถานการณ์ต่อไปนี้ สมมติว่าเรามี ตัวแปรเก็บปี ซึ่งสามารถเปลี่ยนแปลงได้ ตั้งแต่ 1990 ถึง 2099 สมมติว่าเราต้องการดึงสองหลักสุดท้ายของปี เข้าไปในกลุ่มจับ มาเขียนนิพจน์ทั่วไปที่เกี่ยวข้อง:

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

อย่างไรก็ตาม มีสิ่งไม่สะดวกอย่างหนึ่งรอเราอยู่ที่นี่ ประเด็นคือ สำหรับปีในศตวรรษที่แล้ว สองหลัก จะตกไปอยู่ในกลุ่มจับแรก แต่สำหรับปีใน ศตวรรษที่สอง - จะไปอยู่ในกลุ่มจับที่สอง มาดูตัวอย่าง

นี่คือตัวเลือกแรก:

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

และนี่คือตัวเลือกที่สอง:

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

ตอนนี้สมมติว่าเราต้องการบันทึกตัวเลขปีที่พบ ไว้ในตัวแปร เรากำลังจะเจอปัญหา เพราะเราไม่รู้แน่ชัดว่าต้องดึงข้อมูล จากกลุ่มจับด้วยคีย์ใด:

php<?php
  $year = $res[1]; // ต้องการคีย์เป็น 1 หรือ 2
?>

สามารถแก้ปัญหาได้ด้วยเงื่อนไข:

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

อย่างไรก็ตาม มีวิธีแก้ปัญหาที่ง่ายกว่า สามารถใช้ คำสั่งพิเศษ (?| ) กลุ่มจับทั้งหมด ที่อยู่ภายในมันจะมีหมายเลขเดียวกัน

มาแก้ไขนิพจน์ทั่วไปของเรา

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

และตอนนี้ปีของเราจะอยู่ในกลุ่มจับ หมายเลขหนึ่งอย่างแน่นอน:

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

ให้สตริงที่มีวันที่ โดยที่ปีสามารถ เปลี่ยนแปลงได้ตั้งแต่ 1990 ถึง 2099:

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

สำหรับแต่ละวันที่ ให้วางวันลงในกลุ่มจับแรก เดือนลงในกลุ่มจับที่สอง และสองหลักสุดท้ายของปี - ลงในกลุ่มจับที่สาม