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

Ekspresi Reguler di Java, Bagian 1

Dipublikasikan di grup Random-ID
Kami menyampaikan kepada Anda terjemahan panduan singkat ekspresi reguler dalam bahasa 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 1 - 1

Menggunakan API Ekspresi Reguler di Program Java untuk Mengenali dan Menjelaskan Pola

Karakter Java dan berbagai tipe data string memberikan dukungan tingkat rendah untuk pencocokan pola, namun menggunakannya untuk tujuan ini biasanya menambah kompleksitas kode yang signifikan. Kode yang lebih sederhana dan berperforma tinggi diperoleh dengan menggunakan Regex API ("Regular Expression API"). Tutorial ini akan membantu Anda memulai ekspresi reguler dan API Regex. Pertama kita akan membahas tiga kelas yang paling menarik dalam paket secara umum java.util.regex, dan kemudian melihat ke dalam kelas Patterndan menjelajahi konstruksi pencocokan pola yang canggih. Perhatian: Anda dapat mengunduh kode sumber (dibuat oleh Jeff Friesen untuk situs JavaWorld) aplikasi demo dari artikel ini dari sini .

Apa itu ekspresi reguler?

Ekspresi reguler (ekspresi reguler/regex/regexp) adalah string yang merupakan pola yang mendeskripsikan sekumpulan string tertentu. Pola menentukan baris mana yang termasuk dalam himpunan. Polanya terdiri dari literal dan metakarakter—karakter yang memiliki makna khusus, bukan makna literal. Pencocokan pola adalah pencarian teks untuk menemukan kecocokan, yaitu string yang cocok dengan pola ekspresi reguler. Java mendukung pencocokan pola melalui Regex API-nya. API ini terdiri dari tiga kelas: Pattern, Matcherdan PatternSyntaxException, yang terletak di dalam paket java.util.regex:
  • objek kelas Pattern, juga disebut templat, dikompilasi dengan ekspresi reguler.
  • objek kelas Matcher, atau pencocokan, adalah mekanisme interpretasi pola untuk menemukan kecocokan dalam urutan karakter (objek yang kelasnya mengimplementasikan antarmuka java.lang.CharSequencedan berfungsi sebagai sumber teks).
  • Objek kelas PatternSyntaxExceptiondigunakan untuk mendeskripsikan pola ekspresi reguler yang tidak valid.
Java juga menyediakan dukungan untuk pencocokan pola melalui berbagai metode java.lang.String. Misalnya, fungsi hanya boolean matches (String regex)kembali truejika string pemanggil sama persis dengan ekspresi reguler regex.
Metode Nyaman
matches()dan metode kenyamanan kelas berorientasi ekspresi reguler lainnya Stringdiimplementasikan dengan cara yang mirip dengan API Regex.

RegexDemo

Saya membuat aplikasi RegexDemountuk mendemonstrasikan ekspresi reguler Java dan berbagai metode Pattern, Matcherdan PatternSyntaxException. Di bawah ini adalah kode sumber untuk aplikasi demo ini. Listing 1. Demonstrasi ekspresi reguler
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("usage: java RegexDemo regex input");
         return;
      }
      // Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
      args[1] = args[1].replaceAll("\\\\n", "\n");
      try
      {
         System.out.println("regex = " + args[0]);
         System.out.println("input = " + args[1]);
         Pattern p = Pattern.compile(args[0]);
         Matcher m = p.matcher(args[1]);
         while (m.find())
            System.out.println("Found [" + m.group() + "] starting at "
                               + m.start() + " and ending at " + (m.end() - 1));
      }
      catch (PatternSyntaxException pse)
      {
         System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
         System.err.println("Описание: " + pse.getDescription());
         System.err.println("Позиция: " + pse.getIndex());
         System.err.println("Неправильный шаблон: " + pse.getPattern());
      }
   }
}
Hal pertama yang dilakukan metode mainkelas RegexDemoadalah memeriksa baris perintahnya. Ini memerlukan dua argumen: yang pertama adalah ekspresi reguler, dan yang kedua adalah teks masukan yang akan digunakan untuk mencari ekspresi reguler. Anda mungkin perlu menggunakan karakter baris baru dalam teks masukan (\n). Ini hanya dapat dilakukan dengan menentukan karakter \yang diikuti oleh karakter tersebut n. Fungsi ini main()mengubah urutan karakter ini menjadi nilai Unicode 10. Ekspresi Reguler di Java, Bagian 1 - 2Sebagian besar kode RegexDemodiapit dalam file try-catch. Blok tersebut trypertama-tama mengeluarkan ekspresi reguler yang diberikan dan teks masukan, lalu membuat objek Patternyang menyimpan ekspresi reguler yang dikompilasi (ekspresi reguler dikompilasi untuk meningkatkan kinerja pencocokan pola). Pencocokan diekstraksi dari objek Patterndan digunakan untuk mencari kecocokan secara berulang hingga semuanya ditemukan. Blok tersebut catchmemanggil beberapa metode kelas PatternSyntaxExceptionuntuk mengambil informasi berguna tentang pengecualian. Informasi ini dikeluarkan secara berurutan ke aliran keluaran. Belum perlu mengetahui detail cara kerja kode ini: detailnya akan menjadi jelas saat kita mempelajari API di bagian kedua artikel. Namun, Anda harus mengkompilasi Listing 1. Ambil kode dari Listing 1, lalu ketikkan perintah berikut pada command prompt untuk mengkompilasi RegexDemo: javac RegexDemo.java

Kelas Pola dan konstruksinya

Kelas Pattern, yang pertama dari tiga kelas yang membentuk API Regex, adalah representasi ekspresi reguler yang dikompilasi. Dokumentasi SDK kelas Patternmenjelaskan berbagai konstruksi ekspresi reguler, namun jika Anda tidak secara aktif menggunakan ekspresi reguler, bagian dari dokumentasi ini mungkin membingungkan. Apa itu quantifier dan apa perbedaan antara quantifier serakah, enggan, dan posesif? Apa yang dimaksud dengan kelas karakter, pencocokan batas, referensi belakang, dan ekspresi bendera yang disematkan? Saya akan menjawab pertanyaan ini dan pertanyaan lainnya di bagian berikut.

String literal

Konstruksi ekspresi reguler yang paling sederhana adalah string literal. Agar pencocokan pola berhasil, beberapa bagian teks masukan harus cocok dengan pola konstruksi tersebut. Perhatikan contoh berikut: java RegexDemo apple applet Dalam contoh ini, kami mencoba menemukan kecocokan untuk suatu pola appledalam teks masukan applet. Hasil berikut menunjukkan kecocokan yang ditemukan:
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
Kita melihat di output ekspresi reguler dan teks input, dan kemudian indikasi keberhasilan deteksi appledi applet. Selain itu, posisi awal dan akhir pertandingan ini diberikan: 0dan 4, masing-masing. Posisi awal menunjukkan tempat pertama dalam teks di mana ditemukan kecocokan, dan posisi akhir menunjukkan titik terakhir kecocokan. Sekarang katakanlah kita memberikan baris perintah berikut: java RegexDemo apple crabapple Kali ini kita mendapatkan hasil sebagai berikut, dengan posisi awal dan akhir yang berbeda:
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
Jika tidak, dengan dan appletsebagai ekspresi reguler apple- teks masukan, tidak akan ditemukan kecocokan. Seluruh ekspresi reguler harus cocok, tetapi dalam kasus ini, teks masukan tidak mengandung tsetelahnya apple. Ekspresi Reguler di Java, Bagian 1 - 3

Metakarakter

Konstruksi ekspresi reguler yang lebih menarik menggabungkan karakter literal dengan metakarakter. Misalnya, dalam ekspresi reguler a.b, metakarakter titik (.)berarti karakter apa pun di antara adan b. Perhatikan contoh berikut: java RegexDemo .ox "The quick brown fox jumps over the lazy ox." Contoh ini menggunakan .oxekspresi reguler dan The quick brown fox jumps over the lazy ox.teks masukan. RegexDemomencari teks yang cocok dimulai dengan karakter apa saja dan diakhiri dengan. ox.Hasil eksekusinya adalah sebagai berikut:
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
Pada output kita melihat dua kecocokan: foxdan ox(dengan karakter spasi di depannya). Metakarakter . cocok dengan karakter fpada kasus pertama dan spasi pada kasus kedua. Apa yang terjadi jika Anda menggantinya .oxdengan metakarakter .? Yaitu, apa yang kita dapatkan sebagai hasil dari baris perintah berikut: java RegexDemo . "The quick brown fox jumps over the lazy ox." Karena metakarakter titik cocok dengan karakter apa pun, RegexDemomaka akan dihasilkan kecocokan yang ditemukan untuk semua karakter (termasuk karakter titik di akhir) dari teks input:
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
Kutipan metakarakter
Untuk menentukan .atau metakarakter lainnya sebagai karakter literal dalam konstruksi ekspresi reguler, Anda harus menghindarinya dengan salah satu cara berikut:
  • awali dengan karakter garis miring terbalik;
  • Tempatkan metakarakter ini di antara \Qdan \E(misalnya, \Q.\E).
Ingatlah untuk menduplikasi karakter apa pun yang muncul dalam string literal, seperti String regex = "\\.";garis miring terbalik (misalnya, \\.atau \\Q.\\E). Jangan menduplikasi garis miring terbalik yang merupakan bagian dari argumen baris perintah.

Kelas karakter

Terkadang Anda harus membatasi kecocokan yang Anda cari pada sekumpulan karakter tertentu. Misalnya, telusuri teks untuk vokal a, e, i, odan u, dengan setiap kemunculan huruf vokal dianggap cocok. Dalam menyelesaikan masalah seperti itu, kita akan dibantu oleh kelas karakter yang mendefinisikan kumpulan karakter di antara metakarakter dalam tanda kurung siku ( [ ]). Kelas ini Patternmendukung kelas karakter sederhana, kelas rentang, kelas invers, gabungan, persimpangan, dan pengurangan. Kami akan melihat semuanya sekarang.

Kelas Karakter Sederhana

Kelas karakter sederhana terdiri dari karakter yang ditempatkan berdampingan dan hanya cocok dengan karakter tersebut. Misalnya, kelas [abc]cocok dengan karakter a, bdan c. Perhatikan contoh berikut: java RegexDemo [csw] cave Seperti yang dapat Anda lihat dari hasil, dalam contoh ini hanya karakter cyang ada kecocokannya cave:
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0

Kelas karakter terbalik

Kelas karakter terbalik dimulai dengan metakarakter ^dan hanya cocok dengan karakter yang tidak terdapat di dalamnya. Misalnya, kelas [^abc]mencocokkan semua karakter kecuali a, bdan c. Perhatikan contoh berikut: java RegexDemo "[^csw]" cave Perhatikan bahwa pada sistem operasi saya (Windows) tanda kutip ganda diperlukan karena shell memperlakukannya ^sebagai karakter escape. Seperti yang Anda lihat, dalam contoh ini hanya karakter a, vdan yang ditemukan e, yang memiliki kecocokan di cave:
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3

Rentang kelas karakter

Kelas karakter rentang terdiri dari dua karakter yang dipisahkan oleh tanda hubung ( -). Semua karakter, dimulai dengan karakter di sebelah kiri tanda hubung dan diakhiri dengan karakter di sebelah kanan, adalah bagian dari rentang. Misalnya, rentang [a-z]cocok dengan semua huruf kecil Latin. Ini setara dengan mendefinisikan kelas sederhana [abcdefghijklmnopqrstuvwxyz]. Perhatikan contoh berikut: java RegexDemo [a-c] clown Contoh ini hanya akan mencocokkan karakter cyang memiliki kecocokan pada clown:
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Ekspresi Reguler di Java, Bagian 2 Ekspresi Reguler di Java, Bagian 3 Ekspresi Reguler di Java, Bagian 4 Ekspresi Reguler di Java, Bagian 5
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION