PHP-də RegExp-də Qruplar (Kod Blokları)

Qrupların məzmunu yalnız əvəzetmə sətirində deyil, həm də regExp-in özündə əlçatandır: biz nə isə bir qrupa yerləşdirə bilərik, sonra isə birbaşa regExp-də deyə bilərik ki, burada həmin qrupun məzmunu olmalıdır.

Qrupların məzmunu onların nömrələri ilə əlçatandır, onların qarşısında tərs çəpik işarəsi durur. Məsələn, sıfırıncı qrup belə əlçatan olacaq: \0, birinci qrup belə - \1, ikinci - \2 və s.

Əminəm ki, yuxarıda yazılanlar sizə hələlik olduqca qaranlıq görünür. Təəccüblü deyil, çünki qruplar - regExp-in ən az anlaşılan yeridir. Gəlin nümunələr üzərində anlayaq.

Nümunə

Tutaq ki, bizim belə bir sətirimiz var:

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

Gəlin onda bir-birinin ardınca gələn iki eyni hərfi tapaq. Məsələni həll etmək üçün istənilən hərfi axtaracağıq, onu qrupa yerləşdirəcəyik, sonra isə növbəti simvolun həmin qrupun məzmunu olub-olmadığını yoxlayacağıq:

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

Nəticədə dəyişənə aşağıdakı yazılacaq:

php'! ! cd ef'

Nümunə

Tutaq ki, bizim belə bir sətirimiz var:

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

Gəlin onda birinci və sonuncu hərfləri eyni olan bütün sözləri tapaq. Məsələni həll etmək üçün aşağıdakı şablonu yazacağıq: hərf, sonra bir və ya daha çox hərf, və sonra birinci hərflə eyni olan hərf:

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

Nəticədə dəyişənə aşağıdakı yazılacaq:

php'! ! csgd'

Nümunə

\1 əvəzinə \g1 yazmaq olar:

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

Nümunə

Həmçinin \g{1} da yazmaq olar:

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

Nümunə

Qıvrım mötərizələrdə mənfi ədədlər də göstərilə bilər. Bu halda qruplar sondan sayılacaq:

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

Praktiki Tapşırıqlar

Задание 1

Sətir verilib:

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

Ard-arda üç eyni hərf olan bütün alt sətirləri tapın.

Задание 2

Sətir verilib:

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

Ard-arda iki və ya daha çox eyni hərf olan bütün alt sətirləri tapın.

Задание 3

Sətir verilib:

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

Ard-arda iki eyni söz olan bütün alt sətirləri tapın.