JavaRush /Java Blog /Random-ID /Dasar-dasar ekspresi reguler di Java. Bagian 3
articles
Level 15

Dasar-dasar ekspresi reguler di Java. Bagian 3

Dipublikasikan di grup Random-ID
Mari kita lanjutkan mempelajari ekspresi reguler. Pada artikel ini kita akan melihat kelas karakter yang telah ditentukan sebelumnya serta kuantifikasi (mencari urutan). Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 1

Kelas Karakter yang Telah Ditentukan Sebelumnya

Kelas API Patternberisi kelas karakter yang telah ditentukan sebelumnya yang menawarkan pintasan mudah ke ekspresi reguler yang umum digunakan. Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 2Dalam tabel ini, konstruksi di kolom kiri merupakan representasi singkat dari ekspresi di kolom kanan. Misalnya \dberarti angka (0-9), \wberarti 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 \Qdan \Emenggunakannya 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: Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 3Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 4Dalam 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

Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 4Quantifier 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: Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 5Pada 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: Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 6Ketiga 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": Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 7Ekspresi 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": Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 8Karakter "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: Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 9Ekspresi 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: Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 10Untuk 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: Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 11Dalam 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.

Menggunakan Grup Karakter dan Kelas dengan Quantifier

Hingga saat ini, kami telah menguji quantifier pada string yang berisi karakter yang sama. Penghitung hanya berlaku untuk satu karakter, sehingga ekspresi reguler "abc+" akan mencocokkan string yang mengandung "ab" dan "c" satu kali atau lebih. Ini tidak berarti "abc" satu kali atau lebih. Namun bilangan dapat digunakan bersama dengan grup dan kelas karakter, seperti [abc]+ (a atau b atau c, satu kali atau lebih) atau (abc)+ (“abc” satu kali atau lebih). Mari kita cari sekelompok karakter (anjing), tiga kali berturut-turut: Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 12Pada contoh pertama, program menemukan kecocokan, karena pembilang meluas ke sekelompok karakter. Jika Anda menghilangkan tanda kurung, bilangan {3} hanya akan berlaku untuk huruf “g”. Anda juga dapat menggunakan pembilang dengan kelas karakter: Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 13Pembilang {3} berlaku untuk kelas karakter dalam tanda kurung pada contoh pertama, dan pada contoh kedua - hanya untuk karakter “c”.

Perbedaan antara bilangan serakah, malas, dan terlalu serakah

Ada sedikit perbedaan antara bilangan serakah, enggan, dan posesif. Pembilang serakah dinamakan demikian karena mereka mencoba menemukan kecocokan terpanjang: program pertama-tama mencoba "memakan" seluruh string, jika kecocokan tidak ditemukan, maka satu karakter dibuang dan pencarian diulangi hingga kecocokan ditemukan atau tidak ada lagi karakter yang tersisa. Sebaliknya, orang malas memulai dari awal baris, menambahkan karakter demi karakter hingga mereka menemukan kecocokan. Terakhir, kuantifikasi cemburu memindai seluruh string satu kali, tanpa menghapus karakter seperti pada serakah. Untuk demonstrasi, kami akan menggunakan string xfooxxxxxxfoo. Dasar-dasar ekspresi reguler di Java.  Bagian 3 - 14Contoh pertama menggunakan pembilang .* serakah untuk menemukan karakter apa pun, 0 kali atau lebih, diikuti dengan karakter "f" "o" "o". Karena cantifiernya serakah, kecocokan yang ditemukan berisi seluruh string. Pengukur serakah tidak akan menemukan semua kecocokan dalam sebuah string karena pada langkah pertama, setelah memindai seluruh string, ia akan menemukan kecocokan dan menyelesaikan pekerjaannya. Contoh kedua adalah malas dan memulai dari awal baris, menambahkan karakter demi karakter. Program dimulai dengan memeriksa "kekosongan", tapi sejak itu urutan “foo” tidak berada di awal baris, pencarian dilanjutkan dengan penambahan karakter “x”, setelah itu akan ditemukan kecocokan pertama antara indeks 0 dan 4. Pencarian berlanjut hingga akhir baris dan kecocokan kedua akan ditemukan antara indeks 4 dan 13. Contoh ketiga tidak menemukan kebetulan karena pembilangnya cemburu. Dalam hal ini, ekspresi reguler .*+ "memakan" seluruh baris, tidak menyisakan apa pun untuk "foo". Gunakan bilangan cemburu ketika Anda perlu membuang apa pun yang tidak perlu dalam sebuah string, ini akan lebih efektif daripada bilangan serakah yang setara. Itu saja! Tautan ke sumber: Dasar-dasar ekspresi reguler di Java. Bagian 3
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION