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 iniPattern
dan 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
, Matcher
dan 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
, Matcher
dan PatternSyntaxException
merupakan 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 kelasPattern
adalah 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 kontenregex
menjadi representasi perantara yang disimpan dalam filePattern
. Metode ini mengembalikan referensi ke objek jika berhasil, atau memunculkan pengecualianPatternSyntaxException
jika sintaks ekspresi reguler yang tidak valid terdeteksi. Setiap objek kelasMatcher
yang digunakan olehPattern
atau dikembalikan dari objek ini menggunakan pengaturan defaultnya, seperti penelusuran peka huruf besar-kecil. Sebagai contoh, cuplikan kodePattern p = Pattern.compile("(?m)^\\.");
membuat objekPattern
yang menyimpan representasi ekspresi reguler yang dikompilasi untuk mencocokkan string yang dimulai dengan karakter titik.Pattern compile(String regex, int flags)
memecahkan masalah yang sama sepertiPattern compile(String regex)
, tetapi dengan mempertimbangkanflags
: sekumpulan konstanta bit untuk flag bit tipe OR. KelasPattern
mendeklarasikan konstantaCANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINES
yang dapat digabungkan menggunakan bitwise OR (misalnya,CASE_INSENSITIVE | DOTALL
) dan diteruskan sebagai argumenflags
.
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.MULTILINE
dan ekspresi flag bersarang (?m)
melakukan hal yang sama.
Pattern
, bersama dengan flag yang digunakannya. Untuk melakukannya, Anda dapat memanggil metode berikut:
String pattern()
mengembalikan string ekspresi reguler asli yang dikompilasi menjadiPattern
.int flags()
mengembalikan flag objekPattern
.
Pattern
, biasanya digunakan untuk mendapatkan objek Matcher
untuk melakukan operasi pencocokan pola. Metode ini Matcher matcher(Charsequence input)
menciptakan sebuah objek Matcher
yang mencari teks input
yang cocok dengan pola objek Pattern
. Saat dipanggil, ia mengembalikan referensi ke objek ini Matcher
. Misalnya, perintah Matcher m = p.matcher(args[1]);
kembali Matcher
untuk objek Pattern
yang direferensikan oleh variabel p
.
Pencarian satu kali |
---|
Metode static boolean matches(String regex, CharSequence input) kelas Pattern memungkinkan Anda menghemat pembuatan objek Pattern dan Matcher pencarian satu kali menggunakan template. Metode ini mengembalikan nilai benar jika input polanya 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 only hanya berisi spasi dan karakter huruf kecil. |
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. KelasPattern
memberikan kemampuan untuk menyelesaikan tugas membosankan ini dengan lebih mudah menggunakan dua metode pemisahan teks:
-
Metode ini
String[] split(CharSequence text, int limit)
dibagitext
berdasarkan kecocokan yang ditemukan dengan pola objekPattern
dan 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 kemunculannyatext
.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-1
kecocokan dan panjang array tidak lebih darilimit
elemen. - 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.
- Nilai positif mencari tidak lebih dari
- Metode ini
String[] split(CharSequence text)
memanggil metode sebelumnya dengan 0 sebagai argumen batas dan mengembalikan hasil pemanggilannya.
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,Pattern
sebuah 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 c
dan 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 kelasMatcher
menjelaskan mekanisme untuk melakukan operasi pencocokan pola pada urutan karakter dengan menafsirkan ekspresi reguler yang dikompilasi oleh kelas Pattern
. Objek kelas Matcher
mendukung 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 diRegexDemo
Bagian 1. -
Metode ini
boolean find(int start)
mengatur ulang pencocokan dan mencari teks untuk pencocokan berikutnya. Tampilan dimulai dari posisi yang ditentukan oleh parameterstart
. Jika pencarian berhasil, nilai boolean true dikembalikan. Misalnyam.find(1);
memindai teks mulai dari posisi1
(posisi 0 diabaikan). Jika parameterstart
berisi nilai negatif atau nilai yang lebih besar dari panjang teks pencocokan, metode akan memunculkan pengecualianjava.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, kodePattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.matches());
dikeluarkanfalse
karena 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 metodematches();
, semua teks tidak harus sesuai polanya. MisalnyaPattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());
akan menampilkantrue
, karena awal teksabc!
hanya terdiri dari karakter pembentuk kata.
Pattern
, objek kelas Matcher
menyimpan 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 iniMatcher
. Misalnya,m.reset();
menyetel ulang penyelesai yang direferensikan olehm
. -
Metode ini
Matcher reset(CharSequence text)
menyetel ulang status penyelesai dan menyetel teks penyelesai baru menjaditext
. Operasi pencarian pola selanjutnya dimulai di awal teks pencocokan baru. Mengembalikan referensi ke objek saat iniMatcher
. Misalnya,m.reset("new text");
menyetel ulang penyelesai yang direferensikanm
dan menyetel teks penyelesai baru menjadi"new text"
.
Menambahkan teks di akhir
Posisi matcher yang akan ditambahkan ke akhir menentukan awal teks matcher yang ditambahkan ke akhir objek bertipejava.lang.StringBuffer
. Metode berikut menggunakan posisi ini:
-
Metode ini
Matcher appendReplacement(StringBuffer sb, String replacement)
membaca karakter teks pencocokan dan menambahkannya ke akhir objekStringBuffer
yang direferensikan oleh argumensb
. Metode ini berhenti membaca pada karakter terakhir sebelum pencocokan pola sebelumnya. Selanjutnya, metode menambahkan karakter dari objek bertipeString
yang direferensikan oleh argumenreplacement
ke akhir objekStringBuffer
(stringreplacement
mungkin 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
StringBuffer appendTail(StringBuffer sb)
menambahkan semua teks ke suatu objekStringBuffer
dan mengembalikan referensi ke objek tersebut. Setelah pemanggilan metode terakhirappendReplacement(StringBuffer sb, String replacement)
, panggil metodeappendTail(StringBuffer sb)
untuk menyalin teks yang tersisa ke objekStringBuffer
.
Metode ini Matcher appendReplacement(StringBuffer sb, String replacement)
memunculkan pengecualian java.lang.IllegalStateException
jika pencocokan belum menemukan kecocokan atau upaya pencarian sebelumnya gagal. Ini memunculkan pengecualian IndexOutOfBoundsException
jika garis replacement
menentukan grup tangkapan yang tidak ada dalam pola).
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. |
appendReplacement(StringBuffer sb, String replacement)
dan appendTail(StringBuffer sb
untuk mengganti semua kemunculan urutan karakter dalam teks sumber cat
dengan 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 erpillar
setelah setiap kemunculan cat
. Hasil eksekusi kode ini terlihat seperti ini: one caterpillar, two caterpillars, or three caterpillars on a fence
Mengganti teks
Kelas iniMatcher
memberi 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 baruString
, menyalin semua karakter teks matcher (hingga kecocokan pertama) ke string ini, menambahkan karakter dari hingga akhirreplacement
, menyalin karakter yang tersisa ke string dan mengembalikan sebuah objekString
(stringreplacement
dapat 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 metodeString replaceFirst(String replacement)
, tetapi menggantikanreplacement
semua kecocokan yang ditemukan dengan karakter dari string.
\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
GO TO FULL VERSION