Nepamteće zagrade u regularnim izrazima PHP

Zagrade () obavljaju dve funkcije - grupisanje simbola i funkciju capture grupe. A šta raditi ako treba da grupišemo, ali ne želimo da stavimo u capture grupu? Za rešavanje ovog problema smišljene su specijalne nepamteće zagrade (?: ) - one grupišu, ali ne smeštaju u capture grupu.

Primer

U sledećem primeru prve zagrade su nam potrebne za grupisanje, a druge - za capture grupu. Međutim, i jedne i druge zagrade pamte podatke u capture grupu:

php<?php
  $str = 'abab123';
  $reg = '#(ab)+([1-9]+)#';
  preg_match_all($reg, $str, $res);
?>

Kao rezultat, u našim capture grupama će biti sledeće:

php<?php
  var_dump($res[0]); // ispisaće 'abab123'
  var_dump($res[1]); // ispisaće 'ab'
  var_dump($res[2]); // ispisaće '123'
?>

Primer

Učinimo da prvi par zagrada samo grupise, ali ne stavlja u capture grupu:

php<?php
  $str = 'abab123';
  $reg = '#(?:ab)+([1-9]+)#';
  preg_match_all($reg, $str, $res);
?>

Kao rezultat, u prvoj capture grupi će biti naš broj:

php<?php
  var_dump($res[1]); // ispisaće '123'
?>

Praktični zadaci

Задание 1

Date su podniske, podeljene na dva dela proizvoljnim brojem parova $@:

php<?php
  $str = 'aaa$@bbb aaa$@$@bbb aaa$@$@$@bbb';
?>

Pronađite svaku od ovih podniski i za svaku pronađenu podnisku stavite u prvu capture grupu ono što stoji pre razdvajača, a u drugu capture grupu - ono što stoji posle razdvajača.