Blogroll

Kamis, 11 Juni 2015

Tutorial Java: Dasar Regex untuk Pengenalan Pola String

Tutorial Information

ProgramJava
VersionJDK 6+
DifficultyPemula - Standar
Estimated Time30 Menit
DownloadClick this link
Mendeteksi suatu pola dari sebuah string atau kumpulan karakter bisa dengan berbagai macam cara. Misalnya, untuk mencari apakah string “xyz” ada dalah string “abcdefgxyzabc”, cara paling sederhana adalah melakukan perulangan dari awal sampai akhir hingga mengeluarkan hasil apakah ditemukan atau tidak.
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

  1. 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.
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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");
        }
      }
    }
  2. 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.
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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");
        }
      }
    }
  3. 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.
  4. Contoh yang lebih kompleks untuk mencari pola nomor telepon adalah sebagai berikut.
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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);
          }
        }
      }
    }
  5. 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.
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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);
      }
    }
  6. 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.
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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");
          }
        }
      }
    }
Dari penjelasan singkat di atas, Anda bisa mengembangkannya ke berbagai kasus, bahkan untuk masalah yang rumit sekalipun. Selamat mencoba!

0 komentar:

Posting Komentar