JavaRush /Java Blog /Random-ID /Ekspresi Reguler di Java (RegEx)

Ekspresi Reguler di Java (RegEx)

Dipublikasikan di grup Random-ID
Ekspresi reguler adalah topik yang sering ditunda oleh programmer, bahkan yang berpengalaman sekalipun. Namun, sebagian besar pengembang Java cepat atau lambat harus berurusan dengan pemrosesan teks. Paling sering - dengan operasi pencarian dalam teks dan pengeditan. Tanpa ekspresi reguler, kode program produktif dan ringkas yang terkait dengan pemrosesan teks tidak akan terpikirkan. Jadi berhentilah menundanya, mari kita berurusan dengan “pelanggan tetap” sekarang juga. Ini bukanlah tugas yang sulit.

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:
  1. tulis sebagai string menggunakan sintaks ekspresi reguler;
  2. kompilasi string ini menjadi ekspresi reguler;
Bekerja dengan ekspresi reguler di program Java apa pun dimulai dengan membuat objek kelas 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 flagsditentukan di kelas Patterndan 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 Patternadalah konstruktor ekspresi reguler. Di balik terpal, metode ini compilememanggil konstruktor pribadi kelas Patternuntuk 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:
1. Metakarakter untuk mencocokkan batas garis atau teks
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
2. Metakarakter untuk mencari kelas karakter
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
3. Metakarakter untuk mencari simbol pengeditan teks
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
4. Metakarakter untuk mengelompokkan karakter
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)
5. Metasimbol untuk menunjukkan jumlah karakter – bilangan. Pembilang selalu muncul setelah karakter atau sekelompok karakter.
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:
  1. Dalam pola yang diberikan, karakter pertama adalah karakter huruf Rusia А. Matchermencocokkannya dengan setiap karakter teks, dimulai dari posisi nol. Pada posisi nol pada teks kita terdapat simbol Е, sehingga Matchermenelusuri karakter-karakter dalam teks secara berurutan hingga memenuhi kecocokan dengan pola. Dalam contoh kita, ini adalah simbol pada posisi No.5.

    Ekspresi Reguler di Java - 2
  2. Setelah ditemukan kecocokan dengan karakter pertama dari pola, Matcheria memeriksa kecocokan dengan karakter kedua dari pola tersebut. Dalam kasus kami, ini adalah simbol “ .”, yang mewakili karakter apa pun.

    Ekspresi Reguler di Java - 3

    Pada posisi keenam terdapat simbol huruf л. Tentu saja, ini cocok dengan pola "karakter apa pun".

  3. Matcherberalih 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, Matcheria 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).

    Ekspresi Reguler di Java - 4

    Faktanya, Matcheria menangkap seluruh baris sampai akhir - di sinilah “keserakahan” nya terwujud.

  4. Setelah Matchermencapai 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:

    Ekspresi Reguler di Java - 5
  5. Matcher"mengingat" jumlah pengulangan dalam pola " .+" saat mencapai akhir teks, sehingga mengurangi jumlah pengulangan sebanyak satu dan memeriksa pola teks hingga ditemukan kecocokan: Ekspresi Reguler di Java - 6

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. Ekspresi Reguler di Java - 7

Mode pengukur malas

  1. Dalam mode ini, pada tahap awal, seperti dalam mode serakah, kecocokan dicari dengan karakter pertama dari pola:

    Ekspresi Reguler di Java - 8
  2. Selanjutnya, ia mencari kecocokan dengan karakter berikutnya dalam pola - karakter apa pun:

    Ekspresi Reguler di Java - 9
  3. 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 Matcherakan memeriksa apakah teks cocok dengan pola lainnya - karakter “ а” .

    Ekspresi Reguler di Java - 10
  4. Karena tidak ditemukan kecocokan dengan pola dalam teks (pada posisi No. 7 dalam teks terdapat simbol “ л“), Matchermaka 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:

    Ekspresi Reguler di Java - 11
  5. 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.

    Ekspresi Reguler di Java - 12
Sebagai hasil dari metode ini, mainketika 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 ini Patternmempunyai 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 flagsnilai 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 limitmenentukan jumlah maksimum kecocokan yang dicari dalam teks:
  • kapan limit>0– pencarian limit-1kecocokan dilakukan;
  • di limit<0– mencari semua kecocokan dalam teks
  • kapan limit=0– mencari semua kecocokan dalam teks, sementara baris kosong di akhir array dibuang;
Contoh:
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 Matcherdi bawah ini.

Metode kelas pencocokan

Matcheradalah 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, Matchermetode 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. StringAnda dapat menyampaikan tidak hanya , tetapi juga StringBuffer, StringBuilder, Segmentdan sebagai argumen CharBuffer. Templat pencarian adalah objek kelas Patterntempat 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 replaceFirstmembuat replaceAllobjek baru String- string, yang adalah teks sumber yang cocok dengan templat diganti dengan teks yang diteruskan ke metode sebagai argumen. Selain itu, metode ini replaceFirsthanya menggantikan pertandingan pertama, dan replaceAllsemua 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 Patterndan Matcherdibangun ke dalam String. Ini adalah metode seperti split, matches, replaceFirst, replaceAll. Namun kenyataannya, "di balik terpal" mereka menggunakan Patterndan 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 Patterndan 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 kelas Patterndan menggunakan objek kelas tersebut Matcheruntuk 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.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION