Mari kita teruskan kajian kita tentang ungkapan biasa. Dalam artikel ini kita akan melihat kelas aksara yang dipratentukan serta kuantifikasi (mencari urutan).
Kelas Watak Dipratentukan
API kelasPattern
mengandungi kelas aksara pratakrif yang menawarkan pintasan mudah kepada ungkapan biasa yang biasa digunakan. Dalam jadual ini, binaan dalam lajur kiri ialah perwakilan singkatan bagi ungkapan dalam lajur kanan. Contohnya, \d
bermaksud nombor (0-9), \w
bermaksud sebarang huruf besar atau huruf kecil, garis bawah atau nombor). Gunakan kelas aksara yang dipratentukan jika boleh. Ini akan menjadikan kod anda lebih mudah dibaca dan membetulkan ralat. Konstruk yang bermula dengan garis miring ke belakang dipanggil melarikan diri atau dilindungi. Dalam artikel sebelum ini, kita telah bercakap tentang melarikan diri daripada aksara khas dengan garis miring ke belakang atau simbol \Q
dan \E
menggunakannya sebagai aksara biasa. Jika anda menggunakan garis miring ke belakang dengan aksara biasa (huruf), maka anda perlu melepaskan garis miring ke belakang untuk menyusun ungkapan.
private final String REGEX = "\\d"; // цифра
Dalam contoh ini \d
, ungkapan biasa; garis miring ke belakang tambahan adalah perlu untuk program menyusun. Program ujian kami membaca ungkapan biasa terus dari konsol, jadi tiada garis miring tambahan diperlukan. Contoh berikut menunjukkan penggunaan kelas aksara yang dipratentukan: Dalam tiga contoh pertama, ungkapan biasa hanyalah " .
" (aksara khas titik), yang bermaksud sebarang aksara. Oleh itu, pencarian berjaya dalam semua kes. Contoh lain menggunakan kelas aksara yang dipratentukan, yang maknanya telah kita bincangkan dalam jadual di atas.
Pengkuantiti
Pengkuantiti membenarkan anda untuk menentukan bilangan kejadian aksara dalam rentetan. Mari kita lihat dengan lebih dekat selok-belok bagaimana pengkuantiti tamak, malas, dan sangat tamak berfungsi. Pada pandangan pertama nampaknya pengkuantiti X?, X?? dan X?+ berfungsi dengan cara yang sama: "X hadir sekali atau tidak sama sekali." Terdapat sedikit perbezaan dalam pelaksanaan pengkuantiti ini, yang akan kita lihat di bawah.Padanan panjang sifar
Mari kita mulakan dengan yang tamak. Mari kita tulis tiga ungkapan biasa yang berbeza: huruf “a” dengan aksara khas ?, * atau +. Mari lihat apa yang berlaku jika kita menguji ungkapan biasa ini pada baris kosong: Dalam contoh di atas, carian berjaya dalam dua kes pertama, kerana ungkapan a? dan a* membenarkan aksara a hilang daripada rentetan. Juga ambil perhatian bahawa indeks perlawanan permulaan dan terakhir adalah sama (0). Memandangkan rentetan input tidak mempunyai panjang, program tidak menemui apa-apa :) dalam kedudukan pertama. Kes ini dipanggil padanan panjang sifar. Padanan sedemikian berlaku dalam beberapa kes: apabila baris input kosong, pada permulaan baris input, selepas aksara terakhir baris, atau antara aksara dalam baris. Padanan panjang sifar mudah dikesan: ia bermula dan berakhir pada kedudukan yang sama. Mari lihat beberapa lagi contoh padanan sifar panjang. Mari kita teroka padanan sifar dengan beberapa contoh lagi. Mari tukar rentetan input kepada aksara "a" dan perhatikan kesan yang menarik: Ketiga-tiga pengkuantiti menemui aksara "a", tetapi dua yang pertama, yang membenarkan ketiadaan aksara, menemui padanan panjang sifar pada kedudukan 1 - selepas aksara terakhir rentetan. Ini berlaku kerana program menganggap watak "a" sebagai rentetan dan "berjalan" melaluinya sehingga tiada lagi padanan. Bergantung pada pengkuantiti yang digunakan, program akan atau tidak akan menemui "tiada apa-apa" pada penghujung rentetan. Sekarang mari kita tukar rentetan input kepada urutan lima huruf "a": Ungkapan biasa a? mencari padanan untuk setiap huruf dalam rentetan secara berasingan. Ungkapan a* mencari dua padanan: jujukan aksara "a"' dan padanan panjang sifar pada kedudukan 5. Dan akhirnya, ungkapan biasa a+ hanya menemui jujukan aksara "a", tanpa mencari "tiada apa-apa" :) Apakah yang akan berlaku jika rentetan yang mengandungi aksara berbeza diberikan sebagai input? Contohnya, "ababaaaab": Aksara "b" berada di kedudukan 1, 3 dan 8 dan program mencari padanan panjang sifar pada kedudukan ini. Ekspresi biasa a? tidak memberi perhatian kepada "b", tetapi hanya mencari kehadiran (atau ketiadaan) watak "a". Jika pengkuantiti membenarkan ketiadaan "a", semua aksara dalam rentetan selain "a" akan ditunjukkan sebagai padanan panjang sifar. Untuk mencari jujukan panjang tertentu, hanya nyatakan panjang dalam pendakap kerinting: Ungkapan biasa a{3} mencari jujukan tiga aksara "a". Tiada apa-apa ditemui dalam baris pertama kerana tidak cukup a dalam baris. Yang kedua mengandungi 3 aksara, yang ditemui oleh program. Ujian ketiga juga mencari padanan pada permulaan rentetan. Segala-galanya selepas aksara ke-3 tidak memenuhi ungkapan biasa, dalam kod di bawah ia sesuai dan akan terdapat beberapa padanan: Untuk menentukan panjang jujukan 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, atur cara mencari hanya satu padanan kerana rentetan memenuhi keperluan panjang jujukan minimum (3) aksara "a". Akhir sekali, menetapkan panjang jujukan maksimum: Dalam contoh ini, perlawanan pertama berakhir pada aksara keenam. Padanan kedua mengandungi aksara selepas yang keenam, kerana mereka memenuhi keperluan panjang minimum. Jika rentetan satu aksara lebih pendek, tidak akan ada padanan kedua.
GO TO FULL VERSION