Ekspresi reguler mendefinisikan pola string.
Ekspresi reguler dapat digunakan untuk mencari, mengedit, atau memanipulasi teks.
Ekspresi reguler tidak terbatas pada satu bahasa, namun terdapat perbedaan halus dalam setiap bahasa.
Ekspresi reguler Java paling mirip dengan Perl.
Paket java.util.regex terutama mencakup tiga kelas berikut:
Kelas pola:
Objek pola adalah representasi ekspresi reguler yang dikompilasi. Kelas pola tidak memiliki konstruktor publik. Untuk membuat objek Pola, Anda harus terlebih dahulu memanggil metode kompilasi statis publiknya, yang akan mengembalikan objek Pola. Metode ini menerima ekspresi reguler sebagai parameter pertamanya.
Kelas pencocokan:
Objek Matcher adalah mesin yang menafsirkan dan mencocokkan string masukan. Seperti kelas Pattern, Matcher tidak memiliki konstruktor publik. Anda perlu memanggil metode matcher dari objek Pattern untuk mendapatkan objek Matcher.
Pengecualian Sintaks Pola:
PatternSyntaxException adalah kelas pengecualian tidak wajib yang mewakili kesalahan sintaksis dalam pola ekspresi reguler.
Menangkap grup adalah cara untuk memperlakukan beberapa karakter sebagai satu unit, dibuat dengan mengelompokkan karakter dalam tanda kurung.
Misalnya, ekspresi reguler (anjing) membuat satu grup yang berisi "d", "o", dan "g".
Kelompok penangkap diberi nomor dengan menghitung tanda kurung buka dari kiri ke kanan. Misalnya, dalam ekspresi ((A)(B(C))), ada empat grup seperti itu:
((A)(B(C)))
(A)
(B(C))
(C)
Anda dapat memeriksa berapa banyak grup yang dimiliki suatu ekspresi dengan memanggil metode groupCount dari objek matcher. Metode groupCount mengembalikan nilai int, yang menunjukkan bahwa objek pencocokan saat ini memiliki beberapa grup penangkap.
Ada juga grup khusus (grup 0) yang selalu mewakili keseluruhan ekspresi. Grup tidak termasuk dalam nilai kembalian groupCount.
Contoh berikut menunjukkan cara menemukan serangkaian digit dari string tertentu:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches kelas publik
{
public static void main( String args[] ){
// Cari string berdasarkan pola yang ditentukan String line = "Pesanan ini dilakukan untuk QT3000! OK?";
Pola string = "(.*)(\d+)(.*)";
//Membuat objek Pola Pola r = Pattern.compile(pattern);
// Sekarang buat objek matcher Matcher m = r.matcher(line);
jika (m.temukan( )) {
System.out.println("Nilai yang ditemukan: " + m.group(0) );
System.out.println("Nilai yang ditemukan: " + m.group(1) );
System.out.println("Nilai yang ditemukan: " + m.group(2) );
} kalau tidak {
System.out.println("TIDAK COCOK");
}
}
}
Hasil kompilasi dan running dari contoh di atas adalah sebagai berikut:
Nilai yang ditemukan: Pesanan ini dilakukan seharga QT3000!
Nilai yang ditemukan: Pesanan ini dilakukan untuk QT300
Nilai yang ditemukan: 0
karakter | menjelaskan |
---|---|
| Tandai karakter berikutnya sebagai karakter khusus, teks, referensi balik, atau karakter escape oktal. Misalnya, "n" cocok dengan karakter "n". "n" cocok dengan karakter baris baru. Urutan "\" cocok dengan "", dan "(" cocok dengan "(". |
^ | Cocok dengan awal string masukan. Jika properti Multiline objek RegExp disetel, ^ juga akan cocok dengan posisi setelah "n" atau "r". |
$ | Cocok dengan akhir string masukan. Jika properti Multiline objek RegExp diatur, $ juga akan cocok dengan posisi sebelum "n" atau "r". |
* | Mencocokkan karakter atau subekspresi sebelumnya sebanyak nol kali atau lebih. Misalnya, zo* cocok dengan "z" dan "zoo". * Setara dengan {0,}. |
+ | Cocok dengan karakter atau subekspresi sebelumnya satu kali atau lebih. Misalnya, "zo+" cocok dengan "zo" dan "zoo" tetapi tidak cocok dengan "z". + Setara dengan {1,}. |
? | Mencocokkan karakter atau subekspresi sebelumnya sebanyak nol atau satu kali. Misalnya, "do(es)?" cocok dengan "do" atau "do" dalam "does". ? Setara dengan {0,1}. |
{ N } | n adalah bilangan bulat non-negatif. Cocok persis n kali. Misalnya, "o{2}" tidak cocok dengan "o" di "Bob", namun cocok dengan kedua "o" di "makanan". |
{ N ,} | n adalah bilangan bulat non-negatif. Cocokkan setidaknya n kali. Misalnya, "o{2,}" tidak cocok dengan "o" di "Bob", namun cocok dengan semua o di "foooood". "o{1,}" setara dengan "o+". "o{0,}" setara dengan "o*". |
{ n , m } | M dan n adalah bilangan bulat non-negatif, dimana n <= m . Cocokkan paling sedikit n kali dan paling banyak m kali. Misalnya, "o{1,3}" cocok dengan tiga huruf o pertama di "fooooood". 'o{0,1}' setara dengan 'o?'. Catatan: Anda tidak dapat menyisipkan spasi antara koma dan angka. |
? | Jika karakter ini langsung mengikuti kualifikasi lainnya (*, +, ?, { n }, { n ,}, { n , m }), pola pencocokannya adalah "tidak serakah". Pola "tidak serakah" cocok dengan string yang paling pendek, sedangkan pola default "serakah" cocok dengan string yang paling panjang. Misalnya, dalam string "oooo", "o+?" hanya cocok dengan satu "o", sedangkan "o+" cocok dengan semua "o". |
. | Cocok dengan karakter apa pun kecuali "rn". Untuk mencocokkan karakter apa pun termasuk "rn", gunakan pola seperti "[sS]". |
( pola ) | Mencocokkan pola dan menangkap subekspresi yang cocok. Kecocokan yang diambil dapat diambil dari koleksi "kecocokan" yang dihasilkan menggunakan atribut $0…$9 . Untuk mencocokkan karakter braket ( ), gunakan "(" atau ")". |
(?: pola ) | Subekspresi yang cocok dengan pola tetapi tidak menangkap kecocokan, yaitu subekspresi yang tidak menangkap kecocokan dan tidak menyimpan kecocokan untuk digunakan nanti. Ini berguna ketika menggabungkan bagian-bagian pola menggunakan karakter "atau" (|). Misalnya, 'industri(?:y|ies) adalah ekspresi yang lebih ekonomis dibandingkan 'industri|industri'. |
(?= pola ) | Subekspresi yang melakukan pencarian ke depan yang cocok dengan string di awal string yang cocok dengan pattern . Ini adalah kecocokan yang tidak dapat ditangkap, yaitu kecocokan yang tidak dapat ditangkap untuk digunakan nanti. Misalnya, 'Windows (?=95|98|NT|2000)' cocok dengan "Windows" di "Windows 2000" namun tidak cocok dengan "Windows" di "Windows 3.1". Lookahead prediksi tidak menempati karakter, artinya setelah terjadi kecocokan, match selanjutnya dicari segera setelah match sebelumnya, bukan setelah karakter yang membentuk prediksi lookahead. |
(?! pola ) | Subekspresi yang melakukan penelusuran melihat ke belakang yang cocok dengan string penelusuran yang tidak berada di awal string yang cocok dengan pattern . Ini adalah kecocokan yang tidak dapat ditangkap, yaitu kecocokan yang tidak dapat ditangkap untuk digunakan nanti. Misalnya, 'Windows (?!95|98|NT|2000)' cocok dengan "Windows" di "Windows 3.1" namun tidak cocok dengan "Windows" di "Windows 2000". Lookahead prediksi tidak menempati karakter, artinya setelah terjadi kecocokan, match selanjutnya dicari segera setelah match sebelumnya, bukan setelah karakter yang membentuk prediksi lookahead. |
x | .kamu | Cocokkan x atau y . Misalnya, 'z|food' cocok dengan "z" atau "food". '(z|f)ood' cocok dengan "zood" atau "food". |
[ xyz ] | Kumpulan karakter. Cocok dengan karakter apa pun yang terdapat dalam . Misalnya, "[abc]" cocok dengan "a" dalam "polos". |
[^ xyz ] | Kumpulan karakter terbalik. Cocok dengan karakter apa pun yang tidak disertakan. Misalnya, "[^abc]" cocok dengan "p", "l", "i", dan "n" dalam "plain". |
[ az ] | Rentang karakter. Cocok dengan karakter apa pun dalam rentang yang ditentukan. Misalnya, "[az]" cocok dengan huruf kecil apa pun dalam rentang "a" hingga "z". |
[^ az ] | Karakter rentang terbalik. Cocok dengan karakter apa pun yang tidak berada dalam rentang yang ditentukan. Misalnya, "[^az]" cocok dengan karakter apa pun yang tidak berada dalam rentang "a" hingga "z". |
B | Cocok dengan batas kata, yaitu posisi antara kata dan spasi. Misalnya, "erb" cocok dengan "er" pada "never", namun tidak cocok dengan "er" pada "verb". |
B | Pencocokan batas non-kata. "erB" cocok dengan "er" dalam "kata kerja", tetapi tidak cocok dengan "er" dalam "never". |
cx | Cocok dengan karakter kontrol yang ditunjukkan oleh x . Misalnya, cM cocok dengan Control-M atau karakter carriage return. Nilai x harus berada di antara AZ atau az. Jika hal ini tidak terjadi, c dianggap sebagai karakter "c" itu sendiri. |
D | Pencocokan karakter numerik. Setara dengan [0-9]. |
D | Cocok dengan karakter non-numerik. Setara dengan [^0-9]. |
F | Formulir umpan cocok. Setara dengan x0c dan cL. |
N | Pencocokan baris baru. Setara dengan x0a dan cJ. |
R | Cocok dengan karakter pengangkutan kembali. Setara dengan x0d dan cM. |
S | Cocok dengan karakter spasi apa pun, termasuk spasi, tab, umpan formulir, dll. Setara dengan [fnrtv]. |
S | Cocok dengan karakter selain spasi apa pun. Setara dengan [^fnrtv]. |
T | Pencocokan tab. Setara dengan x09 dan cI. |
v | Pencocokan tab vertikal. Setara dengan x0b dan cK. |
w | Cocok dengan semua jenis karakter, termasuk garis bawah. Setara dengan "[A-Za-z0-9_]". |
W | Cocok dengan karakter non-kata apa pun. Setara dengan "[^A-Za-z0-9_]". |
x n | Cocok dengan n , dengan n adalah kode escape heksadesimal. Kode escape heksadesimal harus terdiri dari dua digit. Misalnya, "x41" cocok dengan "A". "x041" sama dengan "x04"&"1". Izinkan kode ASCII dalam ekspresi reguler. |
nomor | Cocok dengan num , di mana num adalah bilangan bulat positif. Referensi balik untuk menangkap kecocokan. Misalnya, "(.)1" cocok dengan dua karakter identik yang berurutan. |
N | Mengidentifikasi kode escape oktal atau referensi balik. Jika n didahului oleh setidaknya n menangkap subekspresi, maka n adalah referensi balik. Sebaliknya, jika n adalah bilangan oktal (0-7), maka n adalah kode escape oktal. |
nm | Mengidentifikasi kode escape oktal atau referensi balik. Jika nm didahului oleh setidaknya nm yang menangkap subekspresi, maka nm adalah referensi balik. Jika nm didahului oleh setidaknya n pengambilan, n adalah referensi balik yang diikuti oleh karakter m . Jika kondisi sebelumnya tidak ada, nm cocok dengan nilai oktal nm , dengan n dan m adalah angka oktal (0-7). |
nml | Jika n adalah bilangan oktal (0-3) dan m serta l adalah bilangan oktal (0-7), cocokkan kode escape oktal nml . |
u n | Cocok dengan n , dengan n adalah karakter Unicode yang direpresentasikan sebagai angka heksadesimal empat digit. Misalnya, u00A9 cocok dengan simbol hak cipta (©). |
Metode indeks memberikan nilai indeks berguna yang menunjukkan dengan tepat di mana kecocokan ditemukan dalam string masukan:
nomor seri | Metode dan instruksi |
---|---|
1 | public int start() mengembalikan indeks awal dari pertandingan sebelumnya. |
2 | public int start(int group) Mengembalikan indeks awal dari urutan yang ditangkap oleh grup tertentu 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 dari urutan yang ditangkap oleh grup tertentu selama operasi pencocokan sebelumnya. |
Metode penelitian memeriksa string masukan dan mengembalikan nilai Boolean yang menunjukkan apakah pola tersebut ditemukan:
nomor seri | Metode dan instruksi |
---|---|
1 | public boolean lookAt() mencoba mencocokkan urutan masukan mulai dari awal rentang hingga pola ini. |
2 | public boolean find() mencoba menemukan urutan masukan berikutnya yang cocok dengan pola ini. |
3 | public boolean find(int start) Menyetel ulang pencocokan ini dan kemudian mencoba menemukan urutan masukan berikutnya mulai dari indeks tertentu yang cocok dengan pola ini. |
4 | public boolean match() mencoba mencocokkan seluruh rentang dengan polanya. |
Metode penggantian adalah metode untuk mengganti teks pada string masukan:
nomor seri | Metode dan instruksi |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) mengimplementasikan langkah-langkah penambahan dan penggantian non-terminal. |
2 | public StringBuffer appendTail(StringBuffer sb) mengimplementasikan langkah-langkah penambahan dan penggantian terminal. |
3 | public String replaceAll(String replacement) Mengganti setiap urutan input yang polanya cocok dengan string pengganti yang diberikan. |
4 | public String replaceFirst(String replacement) Menggantikan urutan input pertama yang polanya cocok dengan string pengganti yang diberikan. |
5 | public static String quoteReplacement(String s) mengembalikan string pengganti literal dari string yang ditentukan. Metode ini mengembalikan string yang berfungsi seperti string literal yang diteruskan ke metode appendReplacement kelas Matcher. |
Berikut adalah contoh penghitungan jumlah kemunculan kata "cat" dalam string input:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches kelas publik
{
String akhir statis pribadi REGEX = "\bcat\b";
String akhir statis pribadi INPUT =
"kucing kucing kucing kucing kucing";
public static void main( String args[] ){
Pola p = Pattern.compile(REGEX);
Pencocokan m = p.matcher(INPUT); // Dapatkan objek pencocokan int count = 0;
while(m.find()) {
hitungan++;
System.out.println("Nomor yang cocok "+hitungan);
Sistem.keluar.println("mulai(): "+m.mulai());
Sistem.keluar.println("end(): "+m.end());
}
}
}
Hasil kompilasi dan running dari contoh di atas adalah sebagai berikut:
Pertandingan nomor 1
mulai(): 0
akhir(): 3
Pertandingan nomor 2
mulai(): 4
akhir(): 7
Pertandingan nomor 3
mulai(): 8
akhir(): 11
Pertandingan nomor 4
mulai(): 19
akhir(): 22
Anda dapat melihat bahwa contoh ini menggunakan batasan kata untuk memastikan bahwa huruf "c" "a" "t" bukan sekadar substring dari kata yang lebih panjang. Ini juga memberikan beberapa informasi berguna tentang di mana dalam string input kecocokan terjadi.
Metode awal mengembalikan indeks awal dari urutan yang ditangkap oleh grup tertentu selama operasi pencocokan sebelumnya, dan metode akhir menambahkan satu ke indeks karakter terakhir yang cocok.
Metode match dan searchingAt keduanya digunakan untuk mencoba mencocokkan pola urutan masukan. Perbedaan di antara keduanya adalah bahwa pencocokan memerlukan seluruh urutan untuk dicocokkan, sedangkan searchingAt tidak.
Kedua metode ini sering digunakan di awal string masukan.
Kami menggunakan contoh berikut untuk menjelaskan fungsi ini:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches kelas publik
{
String akhir statis pribadi REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
pola Pola statis pribadi;
pencocokan Pencocokan statis pribadi;
public static void main( String args[] ){
pola = Pola.kompilasi(REGEX);
matcher = pola.matcher(INPUT);
System.out.println("REGEX saat ini adalah: "+REGEX);
System.out.println("INPUT saat ini adalah: "+INPUT);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
Hasil kompilasi dan running dari contoh di atas adalah sebagai berikut:
REGEX saat ini adalah: foo
INPUT saat ini adalah: fooooooooooooooooo
mencari di(): benar
cocok(): salah
Metode replaceFirst dan replaceAll digunakan untuk mengganti teks yang cocok dengan ekspresi reguler. Perbedaannya adalah replaceFirst menggantikan pertandingan pertama dan replaceAll menggantikan semua pertandingan.
Contoh berikut menjelaskan fungsi ini:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches kelas publik
{
String statis pribadi REGEX = "anjing";
private static String INPUT = "Anjing itu berkata mengeong." +
"Semua anjing berkata mengeong.";
String statis pribadi REPLACE = "kucing";
public static void main(String[] args) {
Pola p = Pattern.compile(REGEX);
//dapatkan objek pencocokan
Pencocokan m = p.pencocokan(INPUT);
INPUT = m.replaceAll(GANTI);
Sistem.keluar.println(INPUT);
}
}
Hasil kompilasi dan running dari contoh di atas adalah sebagai berikut:
Kucing bilang mengeong. Semua kucing bilang mengeong.
Kelas Matcher juga menyediakan metode appendReplacement dan appendTail untuk penggantian teks:
Lihatlah contoh berikut untuk menjelaskan fungsi ini:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches kelas publik
{
String statis pribadi REGEX = "a*b";
String statis pribadi INPUT = "aabfooaabfooabfoob";
String statis pribadi REPLACE = "-";
public static void main(String[] args) {
Pola p = Pattern.compile(REGEX);
// Dapatkan objek matcher Matcher m = p.matcher(INPUT);
StringBuffer sb = StringBuffer baru();
while(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
Sistem.keluar.println(sb.toString());
}
}
Hasil kompilasi dan running dari contoh di atas adalah sebagai berikut:
-foo-foo-foo-
PatternSyntaxException adalah kelas pengecualian yang tidak dipaksakan yang menunjukkan kesalahan sintaksis dalam pola ekspresi reguler.
Kelas PatternSyntaxException menyediakan metode berikut untuk membantu kita melihat kesalahan apa yang terjadi.
nomor seri | Metode dan instruksi |
---|---|
1 | public String getDescription() Mendapatkan deskripsi kesalahan. |
2 | public int getIndex() mendapatkan indeks yang salah. |
3 | public String getPattern() mendapatkan pola ekspresi reguler yang salah. |
4 | public String getMessage() mengembalikan string multiline yang berisi deskripsi kesalahan sintaksis dan indeksnya, pola ekspresi reguler kesalahan, dan indikasi visual indeks kesalahan dalam pola. |