Tanda Kurung Non-Penangkap dalam Regex PHP

Tanda kurung () memiliki dua fungsi - pengelompokan karakter dan fungsi tangkapan (capturing group). Lalu bagaimana jika kita perlu mengelompokkan, tapi tidak ingin menangkapnya? Untuk menyelesaikan masalah seperti ini, diciptakan khusus tanda kurung non-penangkap (?: ) - mereka mengelompokkan, tetapi tidak menangkap ke dalam grup.

Contoh

Dalam contoh berikut, tanda kurung pertama kita butuhkan untuk pengelompokan, dan yang kedua - untuk ditangkap. Namun, kedua tanda kurung tersebut menyimpan data ke dalam grup tangkapan:

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

Hasilnya, dalam grup tangkapan kita akan berisi berikut:

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

Contoh

Mari kita buat agar pasangan tanda kurung pertama hanya mengelompokkan, tetapi tidak menangkap ke dalam grup:

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

Hasilnya, di grup tangkapan pertama akan berisi angka kita:

php<?php
  var_dump($res[1]); // akan menampilkan '123'
?>

Tugas Praktis

Задание 1

Diberikan substring, dipisahkan menjadi dua bagian oleh sejumlah pasangan $@ yang sembarang:

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

Temukan setiap substring seperti itu dan untuk setiap substring yang ditemukan, masukkan ke dalam grup tangkapan pertama apa yang ada sebelum pemisah, dan ke dalam grup tangkapan kedua - apa yang ada setelah pemisah.