Pelajaran modul (3/4)
Grup yang tidak menangkap: `(?:...)`
Seringkali tanda kurung diperlukan hanya untuk mengelompokkan (mengukur, bergantian)
dan BUKAN untuk mengekstraksi nilainya. Dalam hal ini gunakan non-capturing
versi: (?:...). Ini berfungsi sama dengan (...) tetapi tidak membuat
kelompok yang diberi nomor.
Pattern: (?:https?)://(\w+\.\w+)
Sample: https://example.com e http://test.org
Match e gruppi:
match = "https://example.com" gruppo1 = "example.com"
match = "http://test.org" gruppo1 = "test.org"(?:https?) mengelompokkan skema untuk menerapkan pembilang ?, namun kami
tidak tertarik untuk mengekstrak https sebagai grup: grup 1 secara langsung adalah
domain.
Mengapa menggunakannya
- Keterbacaan: pembaca segera memahami bahwa grup ini hanya ada untuk itu struktur, bukan untuk mengekstraksi nilai.
- Performa: mesin tidak harus menyimpan pertandingan grup.
- Penomoran bersih: grup yang diberi nomor tetap selaras "informasi yang sebenarnya saya butuhkan", tanpa gangguan.
Mengoptimalkan dengan grup yang tidak menangkap
Penggunaan (?:...) memberi tahu mesin untuk menerapkan aturan pengelompokan dan penghitungan tanpa membuang memori untuk menyimpan hasil pencocokan perantara. Ini sangat disarankan dalam loop berat atau pemrosesan teks yang sangat panjang.
Cobalah
Ekstrak domain (`example.com`, `test.org`…) dari setiap URL dalam teks. Gunakan `(?:https?)` untuk protokol (tidak perlu menangkapnya) dan satu grup untuk domain.
Tunjukkan petunjuk
Ubah grup pertama dari (https?) menjadi (?:https?): tidak perlu menangkapnya, Anda hanya menginginkan domainnya.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Temukan setiap pengulangan `ab` sebagai satu kecocokan, tetapi TANPA menangkap grup (karena Anda hanya memerlukan keseluruhan kecocokan).
Tunjukkan petunjuk
Sintaks yang sama seperti pelajaran sebelumnya, tetapi dengan (?:ab)+ bukannya (ab)+.
Solusi tersedia setelah 3 upaya
Tantangan tambahan
Find price digits followed optionally by decimal parts inside a non-capturing group, e.g. `100` or `100.50`.
Tunjukkan petunjuk
Gunakan (?:\\.\\d{2})? untuk menjadikan bagian desimal opsional tanpa menangkapnya.
Solusi tersedia setelah 3 upaya