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
$str = 'abab123';
$reg = '#(ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Hasilnya, dalam grup tangkapan kita akan berisi berikut:
<?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
$str = 'abab123';
$reg = '#(?:ab)+([1-9]+)#';
preg_match_all($reg, $str, $res);
?>
Hasilnya, di grup tangkapan pertama akan berisi angka kita:
<?php
var_dump($res[1]); // akan menampilkan '123'
?>
Tugas Praktis
Diberikan substring, dipisahkan menjadi dua bagian
oleh sejumlah pasangan $@ yang sembarang:
<?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.