Apa itu ekspresi reguler RegEx?
Faktanya, ekspresi reguler (RegEx di Java) adalah pola untuk mencari string dalam teks. Di Java, representasi awal dari pola ini selalu berupa string, yaitu objek dari kelas String. Namun, tidak semua string dapat dikompilasi menjadi ekspresi reguler, hanya string yang mengikuti aturan penulisan ekspresi reguler - sintaksis yang ditentukan dalam spesifikasi bahasa. Untuk menulis ekspresi reguler, karakter alfabet dan numerik digunakan, serta karakter meta - karakter yang memiliki arti khusus dalam sintaks ekspresi reguler. Misalnya:String regex = "java"; // string template "java";
String regex = "\\d{3}"; // string template of three numeric characters;
Membuat Ekspresi Reguler di Java
Untuk membuat RegEx di Java, Anda perlu mengikuti dua langkah sederhana:- tulis sebagai string menggunakan sintaks ekspresi reguler;
- kompilasi string ini menjadi ekspresi reguler;
Pattern
. Untuk melakukan ini, Anda perlu memanggil salah satu dari dua metode statis yang tersedia di kelas compile
. Metode pertama mengambil satu argumen - string literal dari ekspresi reguler, dan metode kedua - ditambah parameter lain yang mengaktifkan mode untuk membandingkan templat dengan teks:
public static Pattern compile (String literal)
public static Pattern compile (String literal, int flags)
Daftar nilai parameter yang mungkin flags
ditentukan di kelas Pattern
dan tersedia bagi kita sebagai variabel kelas statis. Misalnya:
Pattern pattern = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//searching for matches with the pattern will be done case-insensitively.
Pada dasarnya, kelas Pattern
adalah konstruktor ekspresi reguler. Di balik terpal, metode ini compile
memanggil konstruktor pribadi kelas Pattern
untuk membuat tampilan terkompilasi. Metode pembuatan instance templat ini diimplementasikan dengan tujuan menjadikannya sebagai objek yang tidak dapat diubah. Saat membuat, pemeriksaan sintaksis ekspresi reguler dilakukan. Jika ada kesalahan pada baris tersebut, pengecualian dihasilkan PatternSyntaxException
.
Sintaks ekspresi reguler
Sintaks ekspresi reguler didasarkan pada penggunaan simbol<([{\^-=$!|]})?*+.>
, yang dapat dikombinasikan dengan karakter alfabet. Tergantung pada perannya, mereka dapat dibagi menjadi beberapa kelompok:
Metakarakter | Tujuan |
---|---|
^ | awal baris |
$ | akhir baris |
\B | batas kata |
\B | bukan batasan kata |
\A | awal masukan |
\G | akhir pertandingan sebelumnya |
\Z | akhir masukan |
\z | akhir masukan |
Metakarakter | Tujuan |
---|---|
\D | simbol digital |
\D | karakter non-numerik |
\S | karakter luar angkasa |
\S | karakter bukan spasi |
\w | karakter alfanumerik atau garis bawah |
\W | karakter apa pun selain alfabet, angka, atau garis bawah |
. | karakter apa pun |
Metakarakter | Tujuan |
---|---|
\T | karakter tab |
\N | karakter baris baru |
\R | karakter pengangkutan kembali |
\F | pergi ke halaman baru |
\u0085 | karakter baris berikutnya |
\u 2028 | karakter pemisah garis |
\u 2029 | simbol pemisah paragraf |
Metakarakter | Tujuan |
---|---|
[a B C] | salah satu di atas (a, b, atau c) |
[^abc] | selain yang tercantum (bukan a,b,c) |
[a-zA-Z] | penggabungan rentang (Karakter Latin a hingga z tidak peka huruf besar-kecil) |
[iklan[mp]] | rangkaian karakter (a ke d dan m ke p) |
[az&&[def]] | perpotongan simbol (simbol d,e,f) |
[az&&[^bc]] | pengurangan karakter (karakter a, dz) |
Metakarakter | Tujuan |
---|---|
? | satu atau hilang |
* | nol kali atau lebih |
+ | satu kali atau lebih |
{N} | n kali |
{N,} | n kali atau lebih |
{n,m} | tidak kurang dari n kali dan tidak lebih dari m kali |
Mode pengukur serakah
Fitur khusus dari pembilang adalah kemampuan untuk menggunakannya dalam mode yang berbeda: serakah, sangat serakah, dan malas. Mode ekstra serakah diaktifkan dengan menambahkan simbol “+
” setelah pembilang, dan mode malas dengan menambahkan simbol “ ?
“. Misalnya:
"A.+a" // greedy mode
"A.++a" // over-greedy mode
"A.+?a" // lazy mode
Dengan menggunakan templat ini sebagai contoh, mari kita coba memahami cara kerja pembilang dalam berbagai mode. Secara default, pembilang beroperasi dalam mode serakah. Artinya, ia mencari kemungkinan kecocokan terlama dalam string. Sebagai hasil dari menjalankan kode ini:
public static void main(String[] args) {
String text = "Egor Alla Alexander";
Pattern pattern = Pattern.compile("A.+a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(text.substring(matcher.start(), matcher.end()));
}
}
kita akan mendapatkan output berikut: Alla Alexa Algoritma pencarian untuk pola tertentu " А.+а
" dilakukan dalam urutan berikut:
-
Dalam pola yang diberikan, karakter pertama adalah karakter huruf Rusia
А
.Matcher
mencocokkannya dengan setiap karakter teks, dimulai dari posisi nol. Pada posisi nol pada teks kita terdapat simbolЕ
, sehinggaMatcher
menelusuri karakter-karakter dalam teks secara berurutan hingga memenuhi kecocokan dengan pola. Dalam contoh kita, ini adalah simbol pada posisi No.5. -
Setelah ditemukan kecocokan dengan karakter pertama dari pola,
Matcher
ia memeriksa kecocokan dengan karakter kedua dari pola tersebut. Dalam kasus kami, ini adalah simbol “.
”, yang mewakili karakter apa pun.Pada posisi keenam terdapat simbol huruf
л
. Tentu saja, ini cocok dengan pola "karakter apa pun". -
Matcher
beralih ke memeriksa karakter berikutnya dari pola. Dalam templat kami, ini ditentukan menggunakan.+
pembilang “ ”. Karena jumlah pengulangan “karakter apa pun” dalam pola adalah satu kali atau lebih,Matcher
ia mengambil karakter berikutnya dari string secara bergantian dan memeriksa kesesuaiannya dengan pola, selama kondisi “karakter apa pun” terpenuhi, dalam contoh kita - sampai akhir baris ( dari posisi No. 7 - No. 18 teks).Faktanya,
Matcher
ia menangkap seluruh baris sampai akhir - di sinilah “keserakahan” nya terwujud. -
Setelah
Matcher
mencapai akhir teks dan selesai memeriksaА.+
bagian “ ” dari pola, Matcher mulai memeriksa sisa pola – karakter hurufа
. Karena teks dalam arah maju telah berakhir, pemeriksaan dilakukan dalam arah sebaliknya, dimulai dari karakter terakhir: -
Matcher
"mengingat" jumlah pengulangan dalam pola ".+
" saat mencapai akhir teks, sehingga mengurangi jumlah pengulangan sebanyak satu dan memeriksa pola teks hingga ditemukan kecocokan:
Mode pengukur ultra-serakah
Dalam mode super-serakah, matcher bekerja mirip dengan mekanisme mode serakah. Perbedaannya adalah ketika Anda mengambil teks sampai akhir baris, tidak ada pencarian mundur. Artinya, tiga tahap pertama dalam mode super serakah akan serupa dengan mode serakah. Setelah menangkap seluruh string, pencocokan menambahkan sisa pola dan membandingkannya dengan string yang ditangkap. Dalam contoh kita, ketika menjalankan metode utama dengan pola "А.++а
", tidak ada kecocokan yang ditemukan.
Mode pengukur malas
-
Dalam mode ini, pada tahap awal, seperti dalam mode serakah, kecocokan dicari dengan karakter pertama dari pola:
-
Selanjutnya, ia mencari kecocokan dengan karakter berikutnya dalam pola - karakter apa pun:
-
Berbeda dengan mode serakah, mode malas mencari kecocokan terpendek dalam teks, jadi setelah menemukan kecocokan dengan karakter kedua dari pola, yang ditentukan oleh titik dan cocok dengan karakter di posisi No. 6 teks, itu
Matcher
akan memeriksa apakah teks cocok dengan pola lainnya - karakter “а
” . -
Karena tidak ditemukan kecocokan dengan pola dalam teks (pada posisi No. 7 dalam teks terdapat simbol “
л
“),Matcher
maka ditambahkan “karakter apa saja” lagi dalam pola, karena ditentukan sebagai satu kali atau lebih, dan sekali lagi membandingkan polanya dengan teks pada posisi No.5 sampai No.8: -
Dalam kasus kami, kecocokan ditemukan, namun akhir teks belum tercapai. Oleh karena itu, dari posisi No. 9, pemeriksaan dimulai dengan mencari karakter pertama dari pola tersebut menggunakan algoritma serupa dan kemudian mengulanginya hingga akhir teks.
main
ketika menggunakan template " А.+?а
", kita akan mendapatkan hasil sebagai berikut: Alla Alexa Seperti yang dapat dilihat dari contoh kita, ketika menggunakan mode pembilang yang berbeda untuk template yang sama, kita mendapatkan hasil yang berbeda. Oleh karena itu, fitur ini perlu diperhitungkan dan memilih mode yang diinginkan tergantung pada hasil yang diinginkan selama pencarian.
Melarikan diri dari karakter dalam ekspresi reguler
Karena ekspresi reguler di Java, atau lebih tepatnya representasi awalnya, ditentukan menggunakan string literal, maka perlu mempertimbangkan aturan spesifikasi Java yang berhubungan dengan string literal. Secara khusus, karakter garis miring terbalik "\
" dalam literal string dalam kode sumber Java ditafsirkan sebagai karakter escape yang memperingatkan kompiler bahwa karakter yang mengikutinya adalah karakter khusus dan harus ditafsirkan dengan cara khusus. Misalnya:
String s = "The root directory is \nWindows";//wrap Windows to a new line
String s = "The root directory is \u00A7Windows";//insert paragraph character before Windows
Oleh karena itu, dalam literal string yang mendeskripsikan ekspresi reguler dan menggunakan \
karakter " " (misalnya, untuk metakarakter), harus digandakan agar kompiler bytecode Java tidak menafsirkannya secara berbeda. Misalnya:
String regex = "\\s"; // template for searching for space characters
String regex = "\"Windows\""; // pattern to search for the string "Windows"
Karakter garis miring terbalik ganda juga harus digunakan untuk keluar dari karakter khusus jika kita berencana menggunakannya sebagai karakter "biasa". Misalnya:
String regex = "How\\?"; // template for searching the string "How?"
Metode kelas Pola
Kelas iniPattern
mempunyai metode lain untuk bekerja dengan ekspresi reguler: String pattern()
– mengembalikan representasi string asli dari ekspresi reguler yang menjadi asal objek dibuat Pattern
:
Pattern pattern = Pattern.compile("abc");
System.out.println(Pattern.pattern())//"abc"
static boolean matches(String regex, CharSequence input)
– memungkinkan Anda memeriksa ekspresi reguler yang diteruskan dalam parameter regex terhadap teks yang diteruskan dalam parameter input
. Pengembalian: benar – jika teks cocok dengan pola; salah – sebaliknya; Contoh:
System.out.println(Pattern.matches("A.+a","Alla"));//true
System.out.println(Pattern.matches("A.+a","Egor Alla Alexander"));//false
int flags()
– mengembalikan flags
nilai parameter templat yang ditetapkan saat dibuat, atau 0 jika parameter ini tidak disetel. Contoh:
Pattern pattern = Pattern.compile("abc");
System.out.println(pattern.flags());// 0
Pattern pattern = Pattern.compile("abc",Pattern.CASE_INSENSITIVE);
System.out.println(pattern.flags());// 2
String[] split(CharSequence text, int limit)
– membagi teks yang diteruskan sebagai parameter ke dalam array elemen String
. Parameter limit
menentukan jumlah maksimum kecocokan yang dicari dalam teks:
- kapan
limit>0
– pencarianlimit-1
kecocokan dilakukan; - di
limit<0
– mencari semua kecocokan dalam teks - kapan
limit=0
– mencari semua kecocokan dalam teks, sementara baris kosong di akhir array dibuang;
public static void main(String[] args) {
String text = "Egor Alla Anna";
Pattern pattern = Pattern.compile("\\s");
String[] strings = pattern.split(text,2);
for (String s : strings) {
System.out.println(s);
}
System.out.println("---------");
String[] strings1 = pattern.split(text);
for (String s : strings1) {
System.out.println(s);
}
}
Output konsol: Egor Alla Anna -------- Egor Alla Anna Kita akan mempertimbangkan metode kelas lain untuk membuat objek Matcher
di bawah ini.
Metode kelas pencocokan
Matcher
adalah kelas tempat objek dibuat untuk mencari pola. Matcher
– ini adalah “mesin pencari”, “mesin” ekspresi reguler. Untuk mencari, dia perlu diberikan dua hal: pola pencarian dan “alamat” untuk mencari. Untuk membuat suatu objek, Matcher
metode berikut disediakan di kelas Pattern
: рublic Matcher matcher(CharSequence input)
Sebagai argumen, metode mengambil urutan karakter yang pencariannya akan dilakukan. Ini adalah objek kelas yang mengimplementasikan antarmuka CharSequence
. String
Anda dapat menyampaikan tidak hanya , tetapi juga StringBuffer
, StringBuilder
, Segment
dan sebagai argumen CharBuffer
. Templat pencarian adalah objek kelas Pattern
tempat metode dipanggil matcher
. Contoh membuat pencocokan:
Pattern p = Pattern.compile("a*b");// compiled the regular expression into a view
Matcher m = p.matcher("aaaaab");//created a search engine in the text “aaaaab” using the pattern "a*b"
Sekarang, dengan bantuan “mesin pencari”, kita dapat mencari kecocokan, mengetahui posisi kecocokan dalam teks, dan mengganti teks menggunakan metode kelas. Metode boolean find()
mencari kecocokan berikutnya dalam teks dengan pola. Dengan menggunakan metode ini dan operator loop, Anda dapat menganalisis seluruh teks sesuai dengan model peristiwa (melakukan operasi yang diperlukan ketika suatu peristiwa terjadi - menemukan kecocokan dalam teks). Misalnya, dengan menggunakan metode kelas ini, int start()
Anda int end()
dapat menentukan posisi kecocokan dalam teks, dan menggunakan metode ini String replaceFirst(String replacement)
, String replaceAll(String replacement)
mengganti kecocokan dalam teks dengan teks pengganti lainnya. Contoh:
public static void main(String[] args) {
String text = "Egor Alla Anna";
Pattern pattern = Pattern.compile("A.+?a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
int start=matcher.start();
int end=matcher.end();
System.out.println("Match found" + text.substring(start,end) + " с "+ start + " By " + (end-1) + "position");
}
System.out.println(matcher.replaceFirst("Ira"));
System.out.println(matcher.replaceAll("Olga"));
System.out.println(text);
}
Keluaran program: Ditemukan kecocokan Alla dari posisi 5 hingga 8 Ditemukan kecocokan Anna dari posisi 10 hingga 13 Egor Ira Anna Egor Olga Olga Egor Alla Anna Dari contoh jelas bahwa metode replaceFirst
membuat replaceAll
objek baru String
- string, yang adalah teks sumber yang cocok dengan templat diganti dengan teks yang diteruskan ke metode sebagai argumen. Selain itu, metode ini replaceFirst
hanya menggantikan pertandingan pertama, dan replaceAll
semua pertandingan dalam ujian. Teks aslinya tetap tidak berubah. Penggunaan metode kelas lainnya Matcher
, serta contoh ekspresi reguler, dapat ditemukan dalam rangkaian artikel ini . Operasi ekspresi reguler yang paling umum saat bekerja dengan teks berasal dari kelas Pattern
dan Matcher
dibangun ke dalam String
. Ini adalah metode seperti split
, matches
, replaceFirst
, replaceAll
. Namun kenyataannya, "di balik terpal" mereka menggunakan Pattern
dan Matcher
. Oleh karena itu, jika Anda perlu mengganti teks atau membandingkan string dalam suatu program tanpa menulis kode yang tidak perlu, gunakan metode String
. Jika Anda memerlukan kemampuan tingkat lanjut, pikirkan tentang kelas Pattern
dan Matcher
.
Kesimpulan
Ekspresi reguler dijelaskan dalam program Java menggunakan string yang cocok dengan pola yang ditentukan oleh aturan. Saat kode dijalankan, Java mengkompilasi ulang string ini menjadi objek kelasPattern
dan menggunakan objek kelas tersebut Matcher
untuk menemukan kecocokan dalam teks. Seperti yang saya katakan di awal, ekspresi reguler sering kali dikesampingkan untuk nanti, karena dianggap sebagai topik yang sulit. Namun, jika Anda memahami dasar-dasar sintaksis, metakarakter, pelolosan, dan mempelajari contoh ekspresi reguler, semuanya akan menjadi jauh lebih sederhana daripada yang terlihat pada pandangan pertama.
GO TO FULL VERSION