Ikke-fangende parenteser i PHP regex

Parenteser () utfører to funksjoner - gruppering av tegn og fangstfunksjon. Men hva gjør vi hvis vi trenger å gruppere, uten å fange? For å løse dette problemet er det spesielle ikke-fangende parenteser (?: ) utviklet - de grupperer, men fanger ikke.

Eksempel

I det følgende eksemplet trenger vi de første parentesene for gruppering, og de andre - for fangst. Imidlertid fanger begge typer parenteser data i fangstgrupper:

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

Som et resultat vil følgende være i våre fangstgrupper:

php<?php
  var_dump($res[0]); // vil skrive ut 'abab123'
  var_dump($res[1]); // vil skrive ut 'ab'
  var_dump($res[2]); // vil skrive ut '123'
?>

Eksempel

La oss gjøre slik at det første paret med parenteser bare grupperer, men ikke fanger:

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

Som et resultat vil tallet vårt være i den første fangstgruppen:

php<?php
  var_dump($res[1]); // vil skrive ut '123'
?>

Praktiske oppgaver

Задание 1

Gitt delstrenger, delt inn i to deler av et vilkårlig antall par med $@:

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

Finn hver av slike delstrenger og for hver funnet delstreng, plasser i den første fangstgruppen det som står før skilletegnet, og i den andre fangstgruppen - det som står etter skilletegnet.