Mari kita lanjutkan mempelajari ekspresi reguler. Pada artikel ini kita akan melihat kelas karakter yang telah ditentukan sebelumnya serta kuantifikasi (mencari urutan).
Kelas Karakter yang Telah Ditentukan Sebelumnya
Kelas APIPattern
berisi kelas karakter yang telah ditentukan sebelumnya yang menawarkan pintasan mudah ke ekspresi reguler yang umum digunakan. Dalam tabel ini, konstruksi di kolom kiri merupakan representasi singkat dari ekspresi di kolom kanan. Misalnya \d
berarti angka (0-9), \w
berarti huruf besar atau kecil, garis bawah atau angka). Gunakan kelas karakter yang telah ditentukan sebelumnya bila memungkinkan. Ini akan membuat kode Anda lebih mudah dibaca dan memperbaiki kesalahan. Konstruksi yang dimulai dengan garis miring terbalik disebut escape atau protected. Pada artikel sebelumnya, kita telah membahas tentang meloloskan karakter khusus dengan garis miring terbalik atau simbol \Q
dan \E
menggunakannya sebagai karakter biasa. Jika Anda menggunakan garis miring terbalik dengan karakter biasa (literal), maka Anda harus keluar dari garis miring terbalik agar ekspresi dapat dikompilasi.
private final String REGEX = "\\d"; // цифра
Dalam contoh ini \d
, ekspresi reguler; garis miring terbalik tambahan diperlukan agar program dapat dikompilasi. Program pengujian kami membaca ekspresi reguler langsung dari konsol, jadi tidak diperlukan garis miring tambahan. Contoh berikut mendemonstrasikan penggunaan kelas karakter yang telah ditentukan sebelumnya: Dalam tiga contoh pertama, ekspresi regulernya hanyalah " .
" (karakter khusus titik), yang berarti karakter apa saja. Oleh karena itu, pencarian berhasil dalam semua kasus. Contoh lain menggunakan kelas karakter yang telah ditentukan sebelumnya, yang artinya telah kita bahas pada tabel di atas.
Pengukur
Quantifier memungkinkan Anda menentukan jumlah kemunculan karakter dalam string. Mari kita lihat lebih dekat seluk-beluk cara kerja bilangan serakah, malas, dan sangat serakah. Sekilas mungkin tampak bahwa bilangan X?, X?? dan X?+ bekerja dengan cara yang sama: “X ada sekali atau tidak sama sekali.” Ada sedikit perbedaan dalam penerapan quantifier ini, yang akan kita lihat di bawah.Pertandingan dengan panjang nol
Mari kita mulai dengan yang serakah. Mari kita tulis tiga ekspresi reguler yang berbeda: huruf “a” dengan karakter khusus ?, * atau +. Mari kita lihat apa yang terjadi jika kita menguji ekspresi reguler ini pada baris kosong: Pada contoh di atas, pencarian berhasil dalam dua kasus pertama, karena ekspresi a? dan a* memungkinkan karakter a hilang dari string. Perhatikan juga bahwa indeks pertandingan awal dan terakhir adalah sama (0). Karena string masukan tidak memiliki panjang, program tidak menemukan apa pun :) di posisi pertama. Kasus ini disebut pencocokan panjang nol. Kecocokan tersebut terjadi dalam beberapa kasus: ketika baris masukan kosong, di awal baris masukan, setelah karakter terakhir baris, atau antar karakter dalam baris. Pertandingan dengan panjang nol mudah dikenali: dimulai dan diakhiri pada posisi yang sama. Mari kita lihat beberapa contoh pencocokan panjang nol lainnya. Mari jelajahi kecocokan zero-length dengan beberapa contoh lagi. Mari kita ubah string masukan ke karakter "a" dan amati efek yang menarik: Ketiga bilangan menemukan karakter "a", tetapi dua bilangan pertama, yang memungkinkan tidak adanya karakter, menemukan kecocokan panjang nol di posisi 1 - setelah karakter terakhir dari string. Hal ini terjadi karena program memperlakukan karakter “a” sebagai string dan “menjalankannya” hingga tidak ada lagi kecocokan. Bergantung pada pembilang yang digunakan, program akan atau tidak akan menemukan "tidak ada" di akhir string. Sekarang mari kita ubah string masukan menjadi rangkaian lima huruf "a": Ekspresi reguler a? menemukan kecocokan untuk setiap huruf dalam string secara terpisah. Ekspresi a* menemukan dua kecocokan: urutan karakter "a"' dan kecocokan panjang nol pada posisi 5. Dan terakhir, ekspresi reguler a+ hanya menemukan rangkaian karakter “a”, tanpa menemukan “tidak ada” :) Apa yang akan terjadi jika string yang berisi karakter berbeda diberikan sebagai input? Misalnya, "ababaaaab": Karakter "b" ada di posisi 1, 3, dan 8 dan program menemukan kecocokan dengan panjang nol di posisi ini. Ekspresi reguler a? tidak memperhatikan “b”, melainkan hanya mencari ada (atau tidaknya) karakter “a”. Jika pembilang mengizinkan tidak adanya "a", semua karakter dalam string selain "a" akan ditampilkan sebagai pencocokan panjang nol. Untuk mencari barisan dengan panjang tertentu, cukup tentukan panjangnya dalam kurung kurawal: Ekspresi reguler a{3} mencari rangkaian tiga karakter "a". Tidak ada yang ditemukan di baris pertama karena jumlah a di baris tidak cukup. Yang kedua berisi 3 karakter yang ditemukan program. Tes ketiga juga menemukan kecocokan di awal string. Segala sesuatu setelah karakter ke-3 tidak memenuhi ekspresi reguler, pada kode di bawah ini memenuhinya dan akan ada beberapa kecocokan: Untuk menentukan panjang urutan minimum, gunakan:Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
Dalam contoh ini, program hanya menemukan satu kecocokan karena string memenuhi persyaratan panjang urutan minimum (3) karakter "a". Terakhir, atur panjang urutan maksimum: Dalam contoh ini, kecocokan pertama berakhir pada karakter keenam. Pertandingan kedua berisi karakter setelah pertandingan keenam, karena mereka memenuhi persyaratan panjang minimum. Jika string lebih pendek satu karakter, tidak akan ada kecocokan kedua.
GO TO FULL VERSION