JavaRush /Blog Java /Random-MS /Asas ungkapan biasa dalam Java. Bahagian 3
articles
Tahap

Asas ungkapan biasa dalam Java. Bahagian 3

Diterbitkan dalam kumpulan
Mari kita teruskan kajian kita tentang ungkapan biasa. Dalam artikel ini kita akan melihat kelas aksara yang dipratentukan serta kuantifikasi (mencari urutan). Asas ungkapan biasa dalam Java.  Bahagian 3 - 1

Kelas Watak Dipratentukan

API kelas Patternmengandungi kelas aksara pratakrif yang menawarkan pintasan mudah kepada ungkapan biasa yang biasa digunakan. Asas ungkapan biasa dalam Java.  Bahagian 3 - 2Dalam jadual ini, binaan dalam lajur kiri ialah perwakilan singkatan bagi ungkapan dalam lajur kanan. Contohnya, \dbermaksud nombor (0-9), \wbermaksud 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 \Qdan \Emenggunakannya 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: Asas ungkapan biasa dalam Java.  Bahagian 3 - 3Asas ungkapan biasa dalam Java.  Bahagian 3 - 4Dalam 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

Asas ungkapan biasa dalam Java.  Bahagian 3 - 4Pengkuantiti 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: Asas ungkapan biasa dalam Java.  Bahagian 3 - 5Dalam 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: Asas ungkapan biasa dalam Java.  Bahagian 3 - 6Ketiga-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": Asas ungkapan biasa dalam Java.  Bahagian 3 - 7Ungkapan 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": Asas ungkapan biasa dalam Java.  Bahagian 3 - 8Aksara "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: Asas ungkapan biasa dalam Java.  Bahagian 3 - 9Ungkapan 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: Asas ungkapan biasa dalam Java.  Bahagian 3 - 10Untuk 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: Asas ungkapan biasa dalam Java.  Bahagian 3 - 11Dalam 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.

Menggunakan Kumpulan dan Kelas Watak dengan Pengkuantiti

Sehingga tahap ini, kami telah menguji pengkuantiti pada rentetan yang mengandungi aksara yang sama. Pengkuantiti hanya digunakan pada satu aksara, jadi ungkapan biasa "abc+" akan memadankan rentetan yang mengandungi "ab" dan "c" satu kali atau lebih. Ia tidak bermaksud "abc" sekali atau lebih. Tetapi pengkuantiti boleh digunakan bersama dengan kumpulan dan kelas aksara, seperti [abc]+ (a atau b atau c, satu atau lebih kali) atau (abc)+ (“abc” satu kali atau lebih). Mari cari sekumpulan watak (anjing), tiga kali dalam satu baris: Asas ungkapan biasa dalam Java.  Bahagian 3 - 12Dalam contoh pertama, program mencari padanan, kerana pengkuantiti meluas kepada sekumpulan aksara. Jika anda mengalih keluar kurungan, pengkuantiti {3} hanya akan digunakan pada huruf "g". Anda juga boleh menggunakan pengkuantiti dengan kelas aksara: Основы регулярных выражений в Java. Часть 3 - 13Pengkuantiti {3} digunakan pada kelas aksara dalam kurungan dalam contoh pertama, dan dalam yang kedua - hanya pada aksara “c”.

Perbezaan antara pengkuantiti tamak, malas dan terlalu tamak

Terdapat sedikit perbezaan antara pengkuantiti tamak, enggan dan memiliki. Pengkuantiti tamak dinamakan sedemikian kerana mereka cuba mencari padanan terpanjang yang mungkin: program mula-mula cuba "memakan" keseluruhan rentetan, jika padanan tidak ditemui, maka satu aksara dibuang dan carian diulang sehingga perlawanan ditemui atau tiada lagi watak yang tinggal. Orang yang malas pula bermula di awal baris, menambah perwatakan demi watak sehingga menemui jodoh. Akhir sekali, kuantifikasi cemburu mengimbas keseluruhan rentetan sekali, tanpa mengalih keluar aksara seperti dalam tamak. Untuk demonstrasi, kami akan menggunakan rentetan xfooxxxxxxfoo. Основы регулярных выражений в Java. Часть 3 - 14Contoh pertama menggunakan pengkuantiti .* tamak untuk mencari sebarang aksara, 0 atau lebih kali, diikuti oleh aksara "f" "o" "o". Memandangkan cantifier adalah tamak, padanan yang ditemui mengandungi keseluruhan rentetan. Pengkuantiti yang tamak tidak akan menemui semua padanan dalam rentetan kerana dalam langkah pertama, selepas mengimbas keseluruhan rentetan, ia akan mencari padanan dan menyelesaikan kerja. Contoh kedua adalah malas dan bermula dari awal baris, menambah watak demi watak. Program ini bermula dengan menyemak "kekosongan", tetapi sejak jujukan "foo" bukan pada permulaan baris, carian diteruskan dengan penambahan aksara "x", selepas itu padanan pertama akan ditemui antara indeks 0 dan 4. Carian diteruskan sehingga penghujung baris dan padanan kedua akan ditemui antara indeks 4 dan 13. Contoh ketiga tidak menemui kebetulan kerana pengkuantiti cemburu. Dalam kes ini, ungkapan biasa .*+ "makan" keseluruhan baris, tidak meninggalkan apa-apa untuk "foo". Gunakan pengkuantiti cemburu apabila anda perlu membuang apa-apa yang tidak perlu dalam rentetan, ia akan menjadi lebih berkesan daripada pengkuantiti tamak yang setara. Itu sahaja! Pautan ke sumber: Asas ungkapan biasa dalam Java. Bahagian 3
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION