Кишэні ў рэгулярным выразе ў PHP

Змесціва кішэняў даступна не толькі ў радку замены, але і ў самой рэгулярцы: мы можам пакласці што-небудзь у кішэнь, а затым проста ў рэгулярцы сказаць, што тут павінна стаяць змесціва гэтага кішэня.

Змесціва кішэняў даступна па іх нумарах, перад якімі стаіць зваротны слэш. Напрыклад, нулявы кішэнь будзе даступны вось так: \0, першы кішэнь вось так - \1, другі - \2 і гэтак далей.

Упэўнены, што ўсё напісанае вышэй пакуль вельмі туманна для вас. Гэта не дзіўна, так якія кішэні - самае незразумелае месца рэгулярак. Давайце будзем разбірацца на прыкладах.

Прыклад

Хай у нас ёсць вось такая радок:

php<?php
  $str = 'aa bb cd ef';
?>

Давайце знойдзем у ёй усе месцы, у якіх стаяць дзве любыя аднолькавыя літары запар. Для вырашэння задачы будзем шукаць любую літару, кладзім яе ў кішэнь, а затым правяраць, ці ідзе наступным сімвалам змесціва гэтага кішэня:

php<?php
  $res = preg_replace('#([a-z])\1#', '!', $str);
?>

У выніку ў зменную запішацца наступнае:

php'! ! cd ef'

Прыклад

Хай у нас ёсць вось такая радок:

php<?php
  $str = 'asxca buzxb csgd';
?>

Давайце знойдзем у ёй усе словы, у якіх аднолькавыя першая і апошняя літары. Для вырашэння задачы напішам наступны шаблон: літара, затым яшчэ адна ці больш літар, а затым такая жа літара як першая:

php<?php
  $res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>

У выніку ў зменную запішацца наступнае:

php'! ! csgd'

Прыклад

Замест \1 можна пісаць \g1:

php<?php
  $res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>

Прыклад

Можна таксама пісаць \g{1}:

php<?php
  $res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>

Прыклад

У фігурных дужках можна паказваць адмоўныя лікі. У гэтым выпадку кішэні будуць адлічвацца з канца:

php<?php
  $res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>

Практычныя задачы

Задание 1

Дадзена радок:

php<?php
  $str = 'aaa bbb ccc xyz';
?>

Знайдзіце ўсе падрадкі, у якіх ёсць тры аднолькавыя літары запар.

Задание 2

Дадзена радок:

php<?php
  $str = 'a aa aaa abab bbbb';
?>

Знайдзіце ўсе падрадкі, у якіх ёсць дзве ці больш аднолькавыя літары запар.

Задание 3

Дадзена радок:

php<?php
  $str = 'aaa aaa bbb bbb ccc ddd';
?>

Знайдзіте ўсе падрадкі, у якіх ёсць два аднолькавыя словы запар.