Menangkap dan mengelompokkan
Grup pengambilan (pattern)
membuat grup yang memiliki properti penangkapan .
Yang terkait yang mungkin sering Anda lihat (dan gunakan) adalah (?:pattern)
, yang membuat grup tanpa properti capture , oleh karena itu dinamai non-capturing group .
Grup biasanya digunakan ketika Anda perlu mengulangi urutan pola, misalnya (\.\w+)+
, atau untuk menentukan di mana pergantian harus diterapkan, misalnya ^(0*1|1*0)$
( ^
, kemudian 0*1
atau 1*0
, kemudian $
) versus ^0*1|1*0$
( ^0*1
atau 1*0$
).
Grup penangkap, selain pengelompokan, juga akan merekam teks yang cocok dengan pola di dalam grup penangkap (pattern)
. Menggunakan contoh Anda (.*):
, .*
pertandingan ABC
dan :
pertandingan :
, dan karena .*
berada di dalam grup penangkap (.*)
, teks ABC
direkam untuk grup penangkap 1.
Nomor grup
Seluruh pola didefinisikan sebagai nomor kelompok 0.
Grup penangkap dalam pola mulai mengindeks dari 1. Indeks ditentukan oleh urutan kurung buka dari grup penangkap . Sebagai contoh, di sini adalah semua 5 kelompok menangkap di bawah pola:
(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
| | | | | | || | |
1-----1 | | 4------4 |5-------5 |
| 3---------------3 |
2-----------------------------------------2
Nomor grup digunakan dalam referensi kembali \n
dalam pola dan $n
dalam string pengganti.
Dalam ragam regex lainnya (PCRE, Perl), mereka juga dapat digunakan dalam panggilan sub-rutin .
Anda dapat mengakses teks yang cocok dengan kelompok tertentu Matcher.group(int group)
. Nomor kelompok dapat diidentifikasi dengan aturan yang disebutkan di atas.
Dalam beberapa jenis regex (PCRE, Perl), terdapat fitur reset cabang yang memungkinkan Anda menggunakan nomor yang sama untuk menangkap grup di cabang pergantian yang berbeda .
Nama grup
Dari Java 7, Anda dapat menentukan grup penangkap bernama (?<name>pattern)
, dan Anda dapat mengakses konten yang cocok dengannya Matcher.group(String name)
. Regex lebih panjang, tetapi kodenya lebih bermakna, karena menunjukkan apa yang Anda coba cocokkan atau ekstrak dengan regex.
Nama grup digunakan dalam referensi-belakang \k<name>
dalam pola dan ${name}
dalam string pengganti.
Grup penangkap bernama masih diberi nomor dengan skema penomoran yang sama, sehingga mereka juga dapat diakses melalui Matcher.group(int group)
.
Secara internal, implementasi Java hanya memetakan dari nama ke nomor grup. Oleh karena itu, Anda tidak dapat menggunakan nama yang sama untuk 2 grup pengambilan yang berbeda.
Untuk Kami
Berikut adalah contoh sederhana dan jelas tentang cara kerjanya
Ekspresi Reguler:
([a-zA-Z0-9]+)([\s]+)([a-zA-Z ]+)([\s]+)([0-9]+)
Tali:
"!* UserName10 John Smith 01123 *!"
Seperti yang Anda lihat, saya telah membuat LIMA grup yang masing-masing diapit tanda kurung.
Saya menyertakan! * Dan *! di kedua sisi untuk membuatnya lebih jelas. Perhatikan bahwa tidak ada karakter tersebut di RegEx dan oleh karena itu tidak akan dibuat dalam hasil. Grup (0) hanya memberi Anda seluruh string yang cocok (semua kriteria pencarian saya dalam satu baris). Grup 1 berhenti tepat sebelum spasi pertama karena karakter spasi tidak termasuk dalam kriteria pencarian. Grup 2 dan 4 hanyalah spasi kosong, yang dalam hal ini secara harfiah merupakan karakter spasi, tetapi bisa juga berupa tab atau umpan baris, dll. Grup 3 menyertakan spasi karena saya memasukkannya ke dalam kriteria pencarian ... dll.
Semoga ini masuk akal.
sumber
Tanda kurung
()
digunakan untuk mengaktifkan pengelompokan frasa regex.The
group(1)
berisi string yang antara kurung(.*)
sehingga.*
dalam hal iniDan
group(0)
berisi seluruh string yang cocok.Jika Anda memiliki lebih banyak grup (baca
(...)
) itu akan dimasukkan ke dalam grup dengan indeks berikutnya (2, 3 dan seterusnya).sumber