PHP'деги регулярдуу жазылыштардагы сактабаган кашалар

Кашалар () эки функцияны аткарат - белгилерди топтоо жана карман функциясы. Ал эми эгерде биз топтоо керек болсо, бирок карманга салбоо керек болсо эмне кылуу керек? Мындай көйгөйгө чечим катары атайын сактабаган кашалар (?: ) ойлоп табылган - алар топтойт, бирок карманга салбайт.

Мисал

Төмөндөгү мисалда биринчи кашалар бизге топтоо үчүн керек, ал эми экинчи кашалар - карман үчүн. Бирок, экөө тең кашалар маалыматтарды карманга сактайт:

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

Натыйжада биздин кармандарда төмөндөгүлөр болот:

php<?php
  var_dump($res[0]); // 'abab123' чыгарат
  var_dump($res[1]); // 'ab' чыгарат
  var_dump($res[2]); // '123' чыгарат
?>

Мисал

Биринчи кашалар жөн гана топтошуп, карманга салбашы үчүн кылалы:

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

Натыйжада биринчи карманда биздин саныбыз болот:

php<?php
  var_dump($res[1]); // '123' чыгарат
?>

Практикалык тапшырмалар

Задание 1

Эки бөлүккө бөлүнгөн, $@ жуптарынын өзгөчө саны менен бөлүнгөн кошумча саптар берилген:

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

Ар бир ушундай кошумча сапты табыңыз жана ар бир табылган кошумча сап үчүн биринчи карманга бөлгүчтүн алдында турган нерсени, ал эми экинчи карманга - бөлгүчтүн артында турган нерсени салыңыз.