Tutorial Java: Dasar Regex untuk Pengenalan Pola String
Tutorial Information
Program | Java |
Version | JDK 6+ |
Difficulty | Pemula - Standar |
Estimated Time | 30 Menit |
Download | Click this link |
Namun cara tersebut cukup merepotkan ketika pola yang dicari cukup rumit. Misalkan saja untuk mendeteksi apakah sebuah string merupakan alamat email yang valid, maka harus dilakukan beberapa perulangan. Perulangan pertama untuk mencari karakter “@”, yang hanya boleh ada satu saja. Kemudian perulangan berikutnya adalah mencari apakah ada titik paling kanan setelah karakter “@” tersebut yang diapit oleh karakter di depan dan di belakangnya.
Berbagai macam pencarian pola sebenarnya dapat diselesaikan dengan cepat menggunakan apa yang disebut dengan Regex. Regex merupakan singkatan dari Regular Expression, yaitu sebuah metode untuk mencari suatu pola dalam sebuah string.
Regex ada pada berbagai bahasa pemrograman, namun sayangnya perilaku regex yang terjadi berbeda-beda. Pada beberapa edisi lalu telah dijelaskan bagaimana cara penggunaan Regex pada bahasa pemrograman PHP dengan pola dari bahasa Perl. Bahasa Java pun memiliki kemampuan untuk mengolah regex dengan cara cukup mudah. Berikut ini adalah beberapa dasar teori regex pada bahasa Java.
Tabel Referensi Regex pada Java
Sebelum masuk ke bagaimana cara menerapkan regex, terlebih dahulu Anda perhatikan tabel A, B, dan C. Tabel A adalah model regex secara umum, yaitu jenis-jenis karakter operasi yang umum digunakan. Tabel B adalah karakter meta yang melambangkan kumpulan jenis karakter lainnya. Perlu diingat bahwa tanda backslash merupakan escape character pada Java, sehingga untuk mendapatkan regex “\w”, harus ditulis “\\w”. Sedangkan tabel C adalah karakter yang digunakan untuk penghitung string atau karakter.Tabel A – Model Regex Umum
Regex | Deskripsi |
. | Seluruh karakter |
^regex | Kata “regex” harus berada di awal string |
regex$ | Kata “regex” harus berada di akhir string |
[abc] | Definisi himpunan karakter yang diperbolehkan, a, b atau c |
[abc[vz]] | Definisi himpunan karakter a, b, atau c yang diikuti oleh v atau z |
[^abc] | Bila tanda “^” berada dalam “[]”, adalah negasi dari himpunan karakter, yaitu karakter selain a, b, dan c |
[a-d1-7] | Tanda “-“ menunjukkan urutan karakter, yaitu a sampai d atau 1 sampai 7 |
X|Z | Tanda “|” berarti “atau”, artinya X atau Z |
XZ | Bila berurutan biasa tanpa tanda apa-apa, artinya X harus diikuti oleh Z |
Tabel B – Karakter Meta
Regex | Deskripsi |
\d | Angka apapun, sama dengan regex [0-9] |
\D | Bukan angka, sama dengan regex [^0-9] |
\s | Whitespace apa pun, sama dengan regex [\t\n\x0b\r\f] |
\S | Bukan whitespace, sama dengan regex [^\s] |
\w | Huruf dan angka apa pun, sama dengan regex [a-zA-Z_0-9] |
\W | Bukan huruf dan angka [^\w] |
Tabel C – Quantifier
Regex | Deskripsi | Contoh |
* | Minimal nol perulangan, sama dengan {0,} | abc* – mencari perulangan abc ataupun boleh tidak ada |
+ | Minimal satu perulangan, sama dengan {1,} | a+ – mencari minimal perulangan satu huruf a |
? | Ada atau tidak, sama dengan {0,1} | xyz? – boleh ada atu tidak string xyz |
{X} | X kali perulangan | \d{3} – 3 kali angka |
{X,Y} | X sampai Y kali perulangan | \d{1,4}- angka harus muncul minimal 1 kali dan maksimal 4 kali |
Tutorial Contoh Implementasi Regex pada Java
- Cara termudah untuk mengimplementasikan regex adalah dengan
menggunakan method matches() pada String apapun. Parameter yang
dimasukkan adalah regex yang diinginkan. Berbeda dengan bahasa
pemrograman lainnya, regex pada Java akan benar-benar mencari pola yang
sesuai. Bila pada PHP, pencarian “fgh” pada string “abcdefghij” dapat
dilakukan dengan plain text “fgh” saja, namun pada Java yang terjadi
bila memasukkan plain text “fgh” adalah sama dengan “^fgh$”. Itu artinya
pencarian di atas tidak akan menemukan hasil. Sedangkan pada bahasa
pemrograman PHP, akan tetap ditemukan. Contoh kode sederhananya adalah
sebagai berikut.
1234567891011121314151617
public
class
RegexTest {
public
static
void
main(String[] args) {
String text =
"abc"
;
String text_with_space =
"abc def"
;
if
(text.matches(
"abc"
)) {
System.out.println(
"String adalah abc"
);
}
else
{
System.out.println(
"String bukan abc"
);
}
if
(text_with_space.matches(
"abc"
)) {
System.out.println(
"String adalah abc"
);
}
else
{
System.out.println(
"String bukan abc"
);
}
}
}
- Karena itu, bila Anda ingin mencari kata “mobil” dalam kalimat “saya
membeli sebuah mobil merah”, Anda harus menambahkan karakter “.+”
sebelum dan sesudah kata “mobil”, seperti berikut ini.
1234567891011
public
class
RegexTest2 {
public
static
void
main(String[] args) {
String regex =
".+mobil.+"
;
String text =
"saya membeli sebuah mobil merah"
;
if
(text.matches(regex)) {
System.out.println(
"Terdapat kata mobil"
);
}
else
{
System.out.println(
"Tidak ada kata mobil"
);
}
}
}
- Selain method matches(), String pada Java juga memiliki method split() dan replace() yang menerima parameter regex. Method split() digunakan untuk memisahkan String dengan regex tertentu, nilai kembalinya berupa array. Sedangkan method replace() akan mengganti pola yang ditemukan dengan string tertentu yang disertakan dalam parameter kedua.
- Contoh yang lebih kompleks untuk mencari pola nomor telepon adalah sebagai berikut.
12345678910111213141516
public
class
RegexTest3 {
public
static
void
main(String[] args) {
List<String> input =
new
ArrayList<String>();
input.add(
"123-45-6789"
);
input.add(
"9876-5-4321"
);
input.add(
"987-65-4321 (attack)"
);
input.add(
"987-65-4321 "
);
input.add(
"192-83-7465"
);
for
(String ssn : input) {
if
(ssn.matches(
"^(\\d{3}-?\\d{2}-?\\d{4})$"
)) {
System.out.println(
"Nomor telepon yang sesuai: "
+ ssn);
}
}
}
}
- Cara lain yang lebih advance untuk mengimplementasikan Regex adalah
dengan menggunakan class java.util.regex.Pattern dan
java.util.regex.Matcher. Kedua class ini memiliki fungsi yang lebih
kompleks namun sangat berguna untuk pemrosesan regex. Salah satunya
adalah untuk replace berikut ini. Dokumentasi lengkap package regex ini
dapat Anda baca pada http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/package-summary.html.
12345678910111213141516
public
class
RegexTest4 {
public
static
void
main(String[] args) {
String input =
"User clientId=23421. Some more text clientId=33432. This clientNum=100"
;
Pattern p = Pattern.compile(
"(clientId=)(\\d+)"
);
Matcher m = p.matcher(input);
StringBuffer result =
new
StringBuffer();
while
(m.find()) {
System.out.println(
"Masking: "
+ m.group(
2
));
m.appendReplacement(result, m.group(
1
) +
"***masked***"
);
}
m.appendTail(result);
System.out.println(result);
}
}
- Contoh kompleks berikutnya adalah pola untuk mendeteksi apakah
string tersebut merupakan valid email. Dengan sedikit pembuatan pola
berdasarkan dari aturan dasar pada table, maka dapat dibuat pola sebagai
berikut.
12345678910111213141516171819202122
public
class
RegexTest5 {
public
static
void
main(String[] args) {
List<String> emails =
new
ArrayList<String>();
emails.add(
"me@haqqi.net"
);
emails.add(
"welcome@welcome@dot.com"
);
emails.add(
"@admin.com"
);
emails.add(
"me@com"
);
emails.add(
"hello@hello.co.id.net"
);
String emailRegex =
"^([a-z0-9\\+_\\-]+)(\\.[a-z0-9\\+_\\-]+)*@([a-z0-9\\-]+\\.)+[a-z]{2,6}$"
;
Iterator<String> iterator = emails.listIterator();
while
(iterator.hasNext()) {
String email = iterator.next();
if
(email.matches(emailRegex)) {
System.out.println(email +
" is a valid email"
);
}
else
{
System.out.println(email +
" is not a valid email"
);
}
}
}
}
0 komentar:
Posting Komentar