JavaRush /Java Blog /Random-ID /Ekspresi Reguler di Java, Bagian 3

Ekspresi Reguler di Java, Bagian 3

Dipublikasikan di grup Random-ID
Untuk perhatian Anda, kami mempersembahkan terjemahan panduan singkat ekspresi reguler di Java, yang ditulis oleh Jeff Friesen untuk situs web javaworld . Untuk kemudahan membaca, kami telah membagi artikel menjadi beberapa bagian. Ekspresi Reguler di Java, Bagian 3 - 1Ekspresi Reguler di Java, Bagian 1 Ekspresi Reguler di Java, Bagian 2

Sederhanakan tugas pemrograman umum dengan Regex API

Di Bagian 1 dan 2 artikel ini, Anda diperkenalkan dengan ekspresi reguler dan Regex API. Anda telah mempelajari kelas ini Patterndan mempelajari contoh-contoh yang mendemonstrasikan konstruksi ekspresi reguler, mulai dari pencocokan pola sederhana menggunakan string literal hingga pencocokan yang lebih kompleks menggunakan rentang, pencocokan batas, dan bilangan. Di bagian ini dan selanjutnya kita akan mempertimbangkan masalah yang tidak tercakup di bagian pertama, kita akan mempelajari metode kelas yang sesuai Pattern, Matcherdan PatternSyntaxException. Anda juga akan mempelajari dua utilitas yang menggunakan ekspresi reguler untuk mempermudah masalah pemrograman umum. Yang pertama mengekstrak komentar dari kode untuk dokumentasi. Yang kedua adalah perpustakaan kode yang dapat digunakan kembali yang dirancang untuk melakukan analisis leksikal - komponen penting dari assembler, compiler, dan perangkat lunak serupa.

MENGUNDUH KODE SUMBER

Anda bisa mendapatkan semua kode sumber (dibuat oleh Jeff Friesen untuk JavaWorld) untuk aplikasi demo di artikel ini dari sini .

Mempelajari API Regex

Pattern, Matcherdan PatternSyntaxExceptionmerupakan tiga kelas yang membentuk Regex API. Masing-masing menyediakan metode yang memungkinkan Anda menggunakan ekspresi reguler dalam kode Anda.

Metode kelas Pola

Sebuah instance dari suatu kelas Patternadalah ekspresi reguler yang dikompilasi, juga dikenal sebagai pola. Ekspresi reguler dikompilasi untuk meningkatkan kinerja operasi pencocokan pola. Metode statis berikut mendukung kompilasi.
  • Pattern compile(String regex)mengkompilasi konten regexmenjadi representasi perantara yang disimpan dalam file Pattern. Metode ini mengembalikan referensi ke objek jika berhasil, atau memunculkan pengecualian PatternSyntaxExceptionjika sintaks ekspresi reguler yang tidak valid terdeteksi. Setiap objek kelas Matcheryang digunakan oleh Patternatau dikembalikan dari objek ini menggunakan pengaturan defaultnya, seperti penelusuran peka huruf besar-kecil. Sebagai contoh, cuplikan kode Pattern p = Pattern.compile("(?m)^\\."); membuat objek Patternyang menyimpan representasi ekspresi reguler yang dikompilasi untuk mencocokkan string yang dimulai dengan karakter titik.

  • Pattern compile(String regex, int flags)memecahkan masalah yang sama seperti Pattern compile(String regex), tetapi dengan mempertimbangkan flags: sekumpulan konstanta bit untuk flag bit tipe OR. Kelas Patternmendeklarasikan konstanta CANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINESyang dapat digabungkan menggunakan bitwise OR (misalnya, CASE_INSENSITIVE | DOTALL) dan diteruskan sebagai argumen flags.

  • Dengan pengecualian CANON_EQ, LITERAL и UNICODE_CHARACTER_CLASS, konstanta ini merupakan alternatif dari ekspresi flag bersarang yang ditunjukkan di Bagian 1. Jika ditemukan konstanta flag selain yang ditentukan dalam kelas Pattern, metode Pattern compile(String regex, int flags) akan memunculkan pengecualian java.lang.IllegalArgumentException. Misalnya, Pattern p = Pattern.compile("^\\.", Pattern.MULTILINE);setara dengan contoh sebelumnya, dengan konstanta Pattern.MULTILINEdan ekspresi flag bersarang (?m)melakukan hal yang sama.
Terkadang perlu untuk mendapatkan salinan string asli dari ekspresi reguler yang dikompilasi menjadi sebuah objek Pattern, bersama dengan flag yang digunakannya. Untuk melakukannya, Anda dapat memanggil metode berikut:
  • String pattern()mengembalikan string ekspresi reguler asli yang dikompilasi menjadi Pattern.

  • int flags()mengembalikan flag objek Pattern.
Setelah menerima objek Pattern, biasanya digunakan untuk mendapatkan objek Matcheruntuk melakukan operasi pencocokan pola. Metode ini Matcher matcher(Charsequence input)menciptakan sebuah objek Matcheryang mencari teks inputyang cocok dengan pola objek Pattern. Saat dipanggil, ia mengembalikan referensi ke objek ini Matcher. Misalnya, perintah Matcher m = p.matcher(args[1]);kembali Matcheruntuk objek Patternyang direferensikan oleh variabel p.
Pencarian satu kali
Metode static boolean matches(String regex, CharSequence input)kelas Patternmemungkinkan Anda menghemat pembuatan objek Patterndan Matcherpencarian satu kali menggunakan template. Metode ini mengembalikan nilai benar jika inputpolanya cocok regex, jika tidak maka akan mengembalikan nilai salah. Jika ekspresi reguler mengandung kesalahan sintaksis, metode akan memunculkan pengecualian PatternSyntaxException. Misalnya, System.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only"));prints true, mengonfirmasi bahwa frasa tersebut all lowercase letters and whitespace onlyhanya berisi spasi dan karakter huruf kecil.
Ekspresi Reguler di Java, Bagian 3 - 2

Memisahkan teks

Sebagian besar pengembang memiliki setidaknya satu kali kode tertulis untuk memecah teks masukan menjadi bagian-bagian komponennya, seperti mengubah akun karyawan berbasis teks menjadi sekumpulan bidang. Kelas Patternmemberikan kemampuan untuk menyelesaikan tugas membosankan ini dengan lebih mudah menggunakan dua metode pemisahan teks:
  • Metode ini String[] split(CharSequence text, int limit)dibagi textberdasarkan kecocokan yang ditemukan dengan pola objek Patterndan mengembalikan hasilnya dalam array. Setiap elemen array menentukan urutan teks yang dipisahkan dari urutan berikutnya dengan fragmen teks yang cocok dengan pola (atau akhir teks). Elemen-elemen array berada dalam urutan yang sama dengan kemunculannya text.

    Dalam metode ini, jumlah elemen array bergantung pada parameter limit, yang juga mengontrol jumlah kecocokan yang dapat ditemukan.

    • Nilai positif mencari tidak lebih dari limit-1kecocokan dan panjang array tidak lebih dari limitelemen.
    • Jika nilainya negatif, semua kemungkinan kecocokan akan dicari, dan panjang array bisa berubah-ubah.
    • Jika nilainya nol, semua kemungkinan kecocokan akan dicari, panjang array bisa berubah-ubah, dan baris kosong di akhir akan dibuang.

  • Metode ini String[] split(CharSequence text)memanggil metode sebelumnya dengan 0 sebagai argumen batas dan mengembalikan hasil pemanggilannya.
Di bawah ini adalah hasil dari metode split(CharSequence text)penyelesaian masalah pemisahan akun pegawai menjadi beberapa kolom yaitu nama, umur, alamat pos dan gaji:
Pattern p = Pattern.compile(",\\s");
String[] fields = p.split("John Doe, 47, Hillsboro Road, 32000");
for (int i = 0; i < fields.length; i++)
   System.out.println(fields[i]);
Kode di atas menjelaskan ekspresi reguler untuk menemukan karakter koma yang segera diikuti oleh karakter spasi tunggal. Berikut hasil pelaksanaannya:
John Doe
47
Hillsboro Road
32000

Predikat templat dan Streams API

Di Java 8, Patternsebuah metode muncul di kelas . Metode ini menciptakan predikat (fungsi dengan nilai boolean) yang digunakan untuk mencocokkan pola. Penggunaan metode ini ditunjukkan pada cuplikan kode berikut: Predicate asPredicate()
List progLangs = Arrays.asList("apl", "basic", "c", "c++", "c#", "cobol", "java", "javascript", "perl", "python", "scala");
Pattern p = Pattern.compile("^c");
progLangs.stream().filter(p.asPredicate()).forEach(System.out::println);
Kode ini membuat daftar nama bahasa pemrograman, kemudian menyusun pola untuk menemukan semua nama yang dimulai dengan huruf c. Baris terakhir kode di atas mengimplementasikan penerimaan aliran data serial dengan daftar ini sebagai sumbernya. Ini menyiapkan filter menggunakan fungsi Boolean asPredicate()yang mengembalikan nilai true ketika nama dimulai dengan huruf cdan mengulangi aliran, mencetak nama yang cocok ke output standar. Baris terakhir ini setara dengan loop reguler berikut, yang familiar dari aplikasi RegexDemo di Bagian 1:
for (String progLang: progLangs)
   if (p.matcher(progLang).find())
      System.out.println(progLang);

Metode kelas pencocokan

Sebuah instance dari kelas Matchermenjelaskan mekanisme untuk melakukan operasi pencocokan pola pada urutan karakter dengan menafsirkan ekspresi reguler yang dikompilasi oleh kelas Pattern. Objek kelas Matchermendukung berbagai jenis operasi pencarian pola:
  • Metode ini boolean find()mencari teks input untuk kecocokan berikutnya. Metode ini mulai memindai di awal teks tertentu atau di karakter pertama setelah kecocokan sebelumnya. Opsi kedua hanya mungkin jika panggilan sebelumnya ke metode ini menghasilkan nilai true dan penyelesainya tidak disetel ulang. Bagaimanapun, jika pencarian berhasil, nilai boolean true akan dikembalikan. Contoh metode ini dapat ditemukan di RegexDemoBagian 1.

  • Metode ini boolean find(int start)mengatur ulang pencocokan dan mencari teks untuk pencocokan berikutnya. Tampilan dimulai dari posisi yang ditentukan oleh parameter start. Jika pencarian berhasil, nilai boolean true dikembalikan. Misalnya m.find(1);memindai teks mulai dari posisi 1(posisi 0 diabaikan). Jika parameter startberisi nilai negatif atau nilai yang lebih besar dari panjang teks pencocokan, metode akan memunculkan pengecualian java.lang.IndexOutOfBoundsException.

  • Metode ini boolean matches()mencoba mencocokkan semua teks dengan suatu pola. Ini mengembalikan nilai boolean true jika semua teks cocok dengan polanya. Misalnya, kode Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.matches());dikeluarkan falsekarena karakter tersebut !bukan karakter kata.

  • Metode ini boolean lookingAt()mencoba mencocokkan teks yang ditentukan dengan polanya. Metode ini mengembalikan nilai true jika ada bagian teks yang cocok dengan polanya. Berbeda dengan metode matches();, semua teks tidak harus sesuai polanya. Misalnya Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());akan menampilkan true, karena awal teks abc!hanya terdiri dari karakter pembentuk kata.

Tidak seperti objek kelas Pattern, objek kelas Matchermenyimpan informasi status. Terkadang Anda mungkin perlu mengatur ulang pencocokan untuk menghapus informasi ini setelah pencarian pola selesai. Metode berikut tersedia untuk mengatur ulang penyelesai:
  • Metode ini Matcher reset()me-reset status matcher, termasuk posisi yang akan ditambahkan ke akhir (reset ke 0). Operasi pencarian pola selanjutnya dimulai di awal teks pencocokan. Mengembalikan referensi ke objek saat ini Matcher. Misalnya, m.reset();menyetel ulang penyelesai yang direferensikan oleh m.

  • Metode ini Matcher reset(CharSequence text)menyetel ulang status penyelesai dan menyetel teks penyelesai baru menjadi text. Operasi pencarian pola selanjutnya dimulai di awal teks pencocokan baru. Mengembalikan referensi ke objek saat ini Matcher. Misalnya, m.reset("new text");menyetel ulang penyelesai yang direferensikan mdan menyetel teks penyelesai baru menjadi "new text".

Ekspresi Reguler di Java, Bagian 3 - 3

Menambahkan teks di akhir

Posisi matcher yang akan ditambahkan ke akhir menentukan awal teks matcher yang ditambahkan ke akhir objek bertipe java.lang.StringBuffer. Metode berikut menggunakan posisi ini:
  • Metode ini Matcher appendReplacement(StringBuffer sb, String replacement)membaca karakter teks pencocokan dan menambahkannya ke akhir objek StringBufferyang direferensikan oleh argumen sb. Metode ini berhenti membaca pada karakter terakhir sebelum pencocokan pola sebelumnya. Selanjutnya, metode menambahkan karakter dari objek bertipe Stringyang direferensikan oleh argumen replacementke akhir objek StringBuffer(string replacementmungkin berisi referensi ke urutan teks yang ditangkap selama pencarian sebelumnya; ini ditentukan menggunakan karakter ($)dan nomor grup yang ditangkap). Terakhir, metode ini menetapkan nilai posisi pencocokan untuk ditambahkan ke posisi karakter terakhir yang cocok ditambah satu, lalu mengembalikan referensi ke pencocokan saat ini.

  • Metode ini Matcher appendReplacement(StringBuffer sb, String replacement)memunculkan pengecualian java.lang.IllegalStateExceptionjika pencocokan belum menemukan kecocokan atau upaya pencarian sebelumnya gagal. Ini memunculkan pengecualian IndexOutOfBoundsExceptionjika garis replacementmenentukan grup tangkapan yang tidak ada dalam pola).

  • Metode ini StringBuffer appendTail(StringBuffer sb)menambahkan semua teks ke suatu objek StringBufferdan mengembalikan referensi ke objek tersebut. Setelah pemanggilan metode terakhir appendReplacement(StringBuffer sb, String replacement), panggil metode appendTail(StringBuffer sb)untuk menyalin teks yang tersisa ke objek StringBuffer.

Kelompok yang ditangkap
Seperti yang Anda ingat dari Bagian 1, grup tangkapan adalah rangkaian karakter yang diapit tanda kurung ( ()) metakarakter. Tujuan dari konstruksi ini adalah untuk menyimpan karakter yang ditemukan untuk digunakan kembali nanti selama pencocokan pola. Semua karakter dari grup yang ditangkap dianggap sebagai satu kesatuan selama pencarian pola.
Kode berikut memanggil metode appendReplacement(StringBuffer sb, String replacement)dan appendTail(StringBuffer sbuntuk mengganti semua kemunculan urutan karakter dalam teks sumber catdengan caterpillar:
Pattern p = Pattern.compile("(cat)");
Matcher m = p.matcher("one cat, two cats, or three cats on a fence");
StringBuffer sb = new StringBuffer();
while (m.find())
   m.appendReplacement(sb, "$1erpillar");
m.appendTail(sb);
System.out.println(sb);
Menggunakan grup yang diambil dan referensi ke grup tersebut dalam teks pengganti memberitahu program untuk menyisipkan erpillarsetelah setiap kemunculan cat. Hasil eksekusi kode ini terlihat seperti ini: one caterpillar, two caterpillars, or three caterpillars on a fence

Mengganti teks

Kelas ini Matchermemberi kita dua metode untuk penggantian teks, yang saling melengkapi dengan appendReplacement(StringBuffer sb, String replacement). Dengan menggunakan metode ini, Anda dapat mengganti kemunculan pertama dari [teks yang diganti] atau semua kemunculan:
  • Metode ini String replaceFirst(String replacement)mengatur ulang matcher, membuat objek baru String, menyalin semua karakter teks matcher (hingga kecocokan pertama) ke string ini, menambahkan karakter dari hingga akhir replacement, menyalin karakter yang tersisa ke string dan mengembalikan sebuah objek String(string replacementdapat berisi referensi ke urutan teks yang diambil selama pencarian sebelumnya menggunakan simbol dolar dan nomor grup yang diambil).

  • Metode ini String replaceAll(String replacement)beroperasi mirip dengan metode String replaceFirst(String replacement), tetapi menggantikan replacementsemua kecocokan yang ditemukan dengan karakter dari string.

Ekspresi reguler \s+mencari satu atau lebih karakter spasi putih dalam teks masukan. Di bawah ini, kita akan menggunakan ekspresi reguler ini dan memanggil metode replaceAll(String replacement)untuk menghapus spasi duplikat:
Pattern p = Pattern.compile("\\s+");
Matcher m = p.matcher("Удаляем      \t\t лишние пробелы.   ");
System.out.println(m.replaceAll(" "));
Berikut hasilnya: Удаляем лишние пробелы. Regular Expression di Java, Part 4 Regular Expression di Java, Part 5
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION