Ekspresi Reguler Java: Menguasai Pencocokan Pola dengan java.util.regex
Java menyediakan paket java.util.regex untuk pencocokan pola menggunakan ekspresi reguler. Ekspresi reguler Java sangat mirip dengan bahasa pemrograman Perl dan sangat mudah dipelajari.
Ekspresi reguler adalah urutan karakter khusus yang membantu Anda mencocokkan atau mencari string lain atau himpunan string, menggunakan sintaks khusus yang disimpan dalam pola. Ekspresi reguler dapat digunakan untuk mencari, mengedit, atau memanipulasi teks dan data.
Paket java.util.regex terutama terdiri dari tiga kelas berikut:
Kelas Pattern – Objek Pattern adalah representasi terkompilasi dari ekspresi reguler. Kelas Pattern tidak menyediakan konstruktor publik. Untuk membuat pola, Anda harus terlebih dahulu memanggil salah satu metode statis publik compile(), yang kemudian akan mengembalikan objek Pattern. Metode ini menerima ekspresi reguler sebagai argumen pertama.
Kelas Matcher – Objek Matcher adalah mesin yang menafsirkan pola dan melakukan operasi pencocokan terhadap string masukan. Sama seperti kelas Pattern, Matcher tidak mendefinisikan konstruktor publik. Anda memperoleh objek Matcher dengan memanggil metode matcher() pada objek Pattern.
PatternSyntaxException – Objek PatternSyntaxException adalah pengecualian tidak diperiksa yang menunjukkan kesalahan sintaks dalam pola ekspresi reguler.
Grup Pengambilan (Capturing Groups)
Grup pengambilan adalah cara untuk memperlakukan beberapa karakter sebagai satu unit. Grup dibuat dengan menempatkan karakter yang akan digolongkan di dalam sepasang tanda kurung. Misalnya, ekspresi reguler (dog) membuat satu grup yang berisi huruf "d", "o", dan "g".
Grup pengambilan diberi nomor dengan menghitung tanda kurung pembuka dari kiri ke kanan. Dalam ekspresi ((A)(B(C))), misalnya, terdapat empat grup berikut:
((A)(B(C))) (A) (B(C)) (C)
Untuk mengetahui berapa banyak grup yang ada dalam ekspresi, panggil metode groupCount pada objek matcher. Metode groupCount mengembalikan nilai int yang menunjukkan jumlah grup pengambilan yang ada dalam pola matcher.
Terkadang juga terdapat grup khusus, grup 0, yang selalu mewakili seluruh ekspresi. Grup ini tidak termasuk dalam total yang dilaporkan oleh groupCount.
Contoh
Contoh berikut menunjukkan cara mencari string angka dari string alfanumerik yang diberikan:
Live Demo
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String args[] ) { // String yang akan dipindai untuk menemukan pola. String line = "This order was placed for QT3000! OK?"; String pattern = "(.*)(\\d+)(.*)"; // Buat objek Pattern Pattern r = Pattern.compile(pattern); // Buat objek matcher. Matcher m = r.matcher(line); if (m.find( )) { System.out.println("Nilai ditemukan: " + m.group(0) ); System.out.println("Nilai ditemukan: " + m.group(1) ); System.out.println("Nilai ditemukan: " + m.group(2) ); } else { System.out.println("TIDAK ADA COCOKAN"); } } } Hasil yang dihasilkan adalah sebagai berikut:
Keluaran
Nilai ditemukan: This order was placed for QT3000! OK? Nilai ditemukan: This order was placed for QT300 Nilai ditemukan: 0
Sintaks Ekspresi Reguler
Berikut adalah tabel yang mencantumkan semua sintaks metakarakter ekspresi reguler yang tersedia di Java:
| Subekspresi | Cocokkan |
| ^ | Mencocokkan awal baris. |
| $ | Mencocokkan akhir baris. |
| . | Mencocokkan satu karakter apa pun kecuali baris baru. Menggunakan opsi m memungkinkan mencocokkan baris baru juga. |
| [...] | Mencocokkan satu karakter apa pun di dalam kurung siku. |
| [^...] | Mencocokkan satu karakter apa pun yang tidak ada di dalam kurung siku. |
| \A | Awal seluruh string. |
| \z | Akhir seluruh string. |
| \Z | Akhir seluruh string kecuali terminator baris akhir yang diperbolehkan. |
| re* | Mencocokkan 0 atau lebih kemunculan ekspresi sebelumnya. |
| re+ | Mencocokkan 1 atau lebih dari hal sebelumnya. |
| re? | Mencocokkan 0 atau 1 kemunculan ekspresi sebelumnya. |
| re{ n} | Mencocokkan tepat n kemunculan ekspresi sebelumnya. |
| re{ n,} | Mencocokkan n atau lebih kemunculan ekspresi sebelumnya. |
| re{ n, m} | Mencocokkan paling sedikit n dan paling banyak m kemunculan ekspresi sebelumnya. |
| a| b | Mencocokkan a atau b. |
| (re) | Mengelompokkan ekspresi reguler dan mengingat teks yang cocok. |
| (?: re) | Mengelompokkan ekspresi reguler tanpa mengingat teks yang cocok. |
| (?> re) | Mencocokkan pola independen tanpa backtracking. |
| \w | Mencocokkan karakter kata. |
| \W | Mencocokkan karakter non-kata. |
| \s | Mencocokkan spasi putih. Sama dengan [\t\n\r\f]. |
| \S | Mencocokkan non-spasi putih. |
| \d | Mencocokkan digit. Sama dengan [0-9]. |
| \D | Mencocokkan non-digit. |
| \A | Mencocokkan awal string. |
| \Z | Mencocokkan akhir string. Jika ada baris baru, mencocokkan tepat sebelum baris baru. |
| \z | Mencocokkan akhir string. |
| \G | Mencocokkan titik di mana pencocokan terakhir selesai. |
| \n | Referensi balik ke grup pengambilan nomor "n". |
| \b | Mencocokkan batas kata ketika di luar kurung. Mencocokkan backspace (0x08) ketika di dalam kurung. |
| \B | Mencocokkan batas non-kata. |
| \n, \t, dll. | Mencocokkan baris baru, carriage return, tab, dan sebagainya. |
| \Q | Escape (kutip) semua karakter hingga \E. |
| \E | Mengakhiri kutipan yang dimulai dengan \Q. |
Metode Kelas Matcher
Berikut adalah daftar metode instance yang berguna:
Metode Indeks
Metode indeks memberikan nilai indeks yang menunjukkan secara tepat di mana pencocokan ditemukan dalam string masukan:
| Sr.No. | Metode & Deskripsi |
| 1 | public int start() Mengembalikan indeks awal dari pencocokan sebelumnya. |
| 2 | public int start(int group) Mengembalikan indeks awal subsequensi yang ditangkap oleh grup yang diberikan selama operasi pencocokan sebelumnya. |
| 3 | public int end() Mengembalikan offset setelah karakter terakhir yang cocok. |
| 4 | public int end(int group) Mengembalikan offset setelah karakter terakhir subsequensi yang ditangkap oleh grup yang diberikan selama operasi pencocokan sebelumnya. |
Metode Studi
Metode studi meninjau string masukan dan mengembalikan Boolean yang menunjukkan apakah pola ditemukan atau tidak:
| Sr.No. | Metode & Deskripsi |
| 1 | public boolean lookingAt() Mencoba mencocokkan urutan masukan, dimulai dari awal wilayah, terhadap pola. |
| 2 | public boolean find() Mencoba menemukan subsequensi berikutnya dari urutan masukan yang cocok dengan pola. |
| 3 | public boolean find(int start) Mengatur ulang matcher ini dan kemudian mencoba menemukan subsequensi berikutnya dari urutan masukan yang cocok dengan pola, dimulai dari indeks yang ditentukan. |
| 4 | public boolean matches() Mencoba mencocokkan seluruh wilayah terhadap pola. |
Metode Penggantian
Metode penggantian adalah metode berguna untuk mengganti teks dalam string masukan:
| Sr.No. | Metode & Deskripsi |
| 1 | public Matcher appendReplacement(StringBuffer sb, String replacement) Mengimplementasikan langkah tambah-dan-ganti non-terminal. |
| 2 | public StringBuffer appendTail(StringBuffer sb) Mengimplementasikan langkah tambah-dan-ganti terminal. |
| 3 | public String replaceAll(String replacement) Mengganti setiap subsequensi dari urutan masukan yang cocok dengan pola dengan string pengganti yang diberikan. |
| 4 | public String replaceFirst(String replacement) Mengganti subsequensi pertama dari urutan masukan yang cocok dengan pola dengan string pengganti yang diberikan. |
| 5 | public static String quoteReplacement(String s) Mengembalikan string pengganti literal untuk string yang ditentukan. Metode ini menghasilkan string yang akan berfungsi sebagai pengganti literal s dalam metode appendReplacement kelas Matcher. |
Metode start dan end
Contoh berikut menghitung jumlah kali kata "cat" muncul dalam string masukan:
Contoh
Live Demo
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "\\bcat\\b"; private static final String INPUT = "cat cat cat cattie cat"; public static void main( String args[] ) { Pattern p = Pattern.compile(REGEX); Matcher m = p.matcher(INPUT); // dapatkan objek matcher int count = 0; while(m.find()) { count++; System.out.println("Pencocokan ke-"+count); System.out.println("start(): "+m.start()); System.out.println("end(): "+m.end()); } } } Hasil yang dihasilkan adalah sebagai berikut:
Keluaran
Pencocokan ke-1 start(): 0 end(): 3 Pencocokan ke-2 start(): 4 end(): 7 Pencocokan ke-3 start(): 8 end(): 11 Pencocokan ke-4 start(): 19 end(): 22
Anda dapat melihat bahwa contoh ini menggunakan batas kata untuk memastikan bahwa huruf "c", "a", "t" bukan sekadar substring dalam kata yang lebih panjang. Ini juga memberikan informasi berguna tentang di mana dalam string masukan pencocokan telah terjadi.
Metode start mengembalikan indeks awal subsequensi yang ditangkap oleh grup yang diberikan selama operasi pencocokan sebelumnya, dan end mengembalikan indeks karakter terakhir yang cocok, ditambah satu.
Metode matches dan lookingAt
Metode matches dan lookingAt keduanya mencoba mencocokkan urutan masukan terhadap pola. Perbedaannya adalah matches memerlukan seluruh urutan masukan untuk dicocokkan, sedangkan lookingAt tidak.
Kedua metode selalu dimulai dari awal string masukan. Berikut adalah contoh yang menjelaskan fungsionalitas:
Contoh
Live Demo
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "foo"; private static final String INPUT = "fooooooooooooooooo"; private static Pattern pattern; private static Matcher matcher; public static void main( String args[] ) { pattern = Pattern.compile(REGEX); matcher = pattern.matcher(INPUT); System.out.println("REGEX saat ini: "+REGEX); System.out.println("INPUT saat ini: "+INPUT); System.out.println("lookingAt(): "+matcher.lookingAt()); System.out.println("matches(): "+matcher.matches()); } } Hasil yang dihasilkan adalah sebagai berikut:
Keluaran
REGEX saat ini: foo INPUT saat ini: fooooooooooooooooo lookingAt(): true matches(): false
Metode replaceFirst dan replaceAll
Metode replaceFirst dan replaceAll mengganti teks yang cocok dengan ekspresi reguler yang diberikan. Seperti namanya menunjukkan, replaceFirst mengganti kemunculan pertama, dan replaceAll mengganti semua kemunculan.
Berikut adalah contoh yang menjelaskan fungsionalitas:
Contoh
Live Demo
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "dog"; private static String INPUT = "The dog says meow. " + "All dogs say meow."; private static String REPLACE = "cat"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); // dapatkan objek matcher Matcher m = p.matcher(INPUT); INPUT = m.replaceAll(REPLACE); System.out.println(INPUT); } } Hasil yang dihasilkan adalah sebagai berikut:
Keluaran
The cat says meow. All cats say meow.
Metode appendReplacement dan appendTail
Kelas Matcher juga menyediakan metode appendReplacement dan appendTail untuk penggantian teks.
Berikut adalah contoh yang menjelaskan fungsionalitas:
Contoh
Live Demo
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "a*b"; private static String INPUT = "aabfooaabfooabfoob"; private static String REPLACE = "-"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); // dapatkan objek matcher Matcher m = p.matcher(INPUT); StringBuffer sb = new StringBuffer(); while(m.find()) { m.appendReplacement(sb, REPLACE); } m.appendTail(sb); System.out.println(sb.toString()); } } Hasil yang dihasilkan adalah sebagai berikut:
Keluaran
-foo-foo-foo-
Metode Kelas PatternSyntaxException
Sebuah PatternSyntaxException adalah pengecualian tidak diperiksa yang menunjukkan kesalahan sintaks dalam pola ekspresi reguler. Kelas PatternSyntaxException menyediakan metode berikut untuk membantu Anda menentukan apa yang salah:
| Sr.No. | Metode & Deskripsi |
| 1 | public String getDescription() Mengambil deskripsi kesalahan. |
| 2 | public int getIndex() Mengambil indeks kesalahan. |
| 3 | public String getPattern() Mengambil pola ekspresi reguler yang salah. |
| 4 | public String getMessage() Mengembalikan string multi-baris yang berisi deskripsi kesalahan sintaks dan indeksnya, pola ekspresi reguler yang salah, dan indikasi visual indeks kesalahan dalam pola. |