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.
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
Pattern
dan 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
,
Matcher
dan
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.CharSequence
dan berfungsi sebagai sumber teks).
- Objek kelas
PatternSyntaxException
digunakan 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
true
jika string pemanggil sama persis dengan ekspresi reguler
regex
.
Metode Nyaman |
matches() dan metode kenyamanan kelas berorientasi ekspresi reguler lainnya String diimplementasikan dengan cara yang mirip dengan API Regex. |
RegexDemo
Saya membuat aplikasi
RegexDemo
untuk mendemonstrasikan ekspresi reguler Java dan berbagai metode
Pattern
,
Matcher
dan
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;
}
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
main
kelas
RegexDemo
adalah 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.
Sebagian besar kode
RegexDemo
diapit dalam file
try-catch
. Blok tersebut
try
pertama-tama mengeluarkan ekspresi reguler yang diberikan dan teks masukan, lalu membuat objek
Pattern
yang menyimpan ekspresi reguler yang dikompilasi (ekspresi reguler dikompilasi untuk meningkatkan kinerja pencocokan pola). Pencocokan diekstraksi dari objek
Pattern
dan digunakan untuk mencari kecocokan secara berulang hingga semuanya ditemukan. Blok tersebut
catch
memanggil beberapa metode kelas
PatternSyntaxException
untuk 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
Pattern
menjelaskan 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
apple
dalam 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
apple
di applet. Selain itu, posisi awal dan akhir pertandingan ini diberikan:
0
dan
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
applet
sebagai ekspresi reguler
apple
- teks masukan, tidak akan ditemukan kecocokan. Seluruh ekspresi reguler harus cocok, tetapi dalam kasus ini, teks masukan tidak mengandung
t
setelahnya
apple
.
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
a
dan b. Perhatikan contoh berikut:
java RegexDemo .ox "The quick brown fox jumps over the lazy ox."
Contoh ini menggunakan
.ox
ekspresi reguler dan
The quick brown fox jumps over the lazy ox.
teks masukan.
RegexDemo
mencari 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:
fox
dan
ox
(dengan karakter spasi di depannya). Metakarakter
.
cocok dengan karakter
f
pada kasus pertama dan spasi pada kasus kedua. Apa yang terjadi jika Anda menggantinya
.ox
dengan 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,
RegexDemo
maka 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
\Q dan \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
,
o
dan
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
Pattern
mendukung 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
,
b
dan
c
. Perhatikan contoh berikut:
java RegexDemo [csw] cave
Seperti yang dapat Anda lihat dari hasil, dalam contoh ini hanya karakter
c
yang 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
,
b
dan
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
,
v
dan 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
c
yang 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
Apa lagi yang harus dibaca: |
|
GO TO FULL VERSION