Sabtu, 18 Mei 2013

REGULAR EXPRESSION(RegEx) PADA C#



A.    Pengertian RegEx
Regex adalah sebuah pattern matching, yaitu notasi yang digunakan untuk mencocokkan teks dan data, dan memanipulasinya. Biasanya lebih sering digunakan untuk string.
Contoh: validasi input email/password, searching, replace.
RegEx memiliki 2 fungsi utama yakni mencari dan mengganti, mencari suatu pola tertentu dalam text lalu menggantinya menjadi pola yang lain. Dengan menggunakan Regex, kita dapat dengan mudah menemukan pola karakter spesifisik dari sejumlah teks. Kita juga dapat dengan mudah mengganti, memodifikasi atau menghapus suatu substring dengan cepat dan akurat sesuai dengan Regex yang telah kita buat. Keuntungan menggunakan regex adalah tidak ada keterbatasan untuk ukuran data numeric.
Regular Expression digunakan oleh banyak teks editor, utilities, dan bahasa pemrograman untuk pencarian dan memanipulasi teks berdasarkan pola. Misalnya, Perl, Ruby, PHP,VB dan Tcl memiliki engine Regular Expression yang kuat dibangun pada syntax mereka.
Sering kali orang beranggapan bahwa regex susah dan membingungkan. Namun sebenarnya regex sangatlah membantu dalam menemukan pola-pola kalimat. Sehingga percobaan terhadap semua kemungkinan pola kalimat tidak perlu dilakukan. Sebuah alasan yang sangat bagus untuk menggunakan  regex adalah karena regex sangatlah powerfull. Pada level rendah  regex dapat mencari sebuah penggalan kata. Pada level tinggi  regex mampu melakukan kontrol terhadap data. Baik mencari, menghapus dan merubah.
B.      Sejarah RegEx
Tahun 1950an, Stephen Cole Kleene seorang ahli matematika membuat sebuah model pattern string menggunakan notasi matematika, yang disebut regular sets. Ken Thompson mengimplementasikan notasi tersebut ke dalam text editor buatannya, QED, untuk pencarian string dengan pola tertentu. Dia juga menambahkan fitur tersebut ke dalam ed, sebuah editor text dalam sistem operasi unix. Untuk pencarian string dalam ed menggunakan pattern, perintahnya: /g /re /p (/g : globally, /re : regular expression, /p : print) yang maksudnya adalah pencarian global baris - baris dalam sebuah file yang memiliki pola tertentu, dan ditampilkan/cetak/print. Istilah Grep akhirnya digunakan sebagai nama sebuah program atau tool dalam sistem operasi unix untuk fungsi yang sama yakni pencarian string.
C.     Prinsip Kerja RegEx
Engine RegEx terdiri dari 2 jenis Text-directed engine dan regex-directed engine atau ada juga yang mengatakan DFA (Deterministic Finite Automaton) dan NFA (Nondeterministic Finite Automaton) engines. Namun jenis mesin engine yang lebih banyak diminati adalah regex-directed engine, disamping itu featurenya lebih hebat dari text-directed engine.
            Misalnya saja kita mencocokan kata “regex” dengan kata “belajar regex sekarang”, pertama-tama regex akan memulai mencocokan karakter pertama yaitu huruf “R” dengan “B”, karena tidak cocok maka akan dilanjutkan ke tempat selanjutny yaitu “R” dengan “E”, karena masih belum cocok juga proses ini akan terus berlanjut, hingga akhirnya menemukan hurup “R” yaitu di posisi ke-7, hasil ini akan disimpan di memori bahwa telah valid pada posisi ke-7, kemudian akan meneruskan langkah selanjutnya mencocokan hurup “E” dengan ” ” dan ternyata tidak cocok, engine akan mulai melakukan pencocokan kembali. Karena huruf “E” tidak ditemukan maka kali ini engine akan kembali menggunakan huruf “R” dan dicocokan pada posisi ke-9 yakni huruf “R”. Karena valid, engine menggunakan huruf berikutnya yakni huruf “E” dan dicocokan dengan posisi ke-10 yakni huruf=”E”. Proses ini akan terus diulang hingga mencapai posisi akhir suatu himpunan string. Nah jika kata “regex” ditemukan oleh kata “belajar regex sekarang” maka engine akan melaporkan bahwa Regular Expression telah valid, meskipun masih ada karakter yang belum di validasi (kata “sekarang”). Itu adalah cara kerja NFA yang lama, berbeda dengan mesin NFA yang sekarang, sudah lebih baik, yaitu meskipun string yang dicari telah match tetap akan diteruskan sampai benar-benar valid ditemukan. Setelah itu baru dibuat laporan sukses. Berbeda dengan engine dari NFA, engine DFA memilik cara kerja yakni membandingkan semua karakter secara serempak, hal ini membuat total memory yang dibutuhkan lebih besar dari NFA, sehingga teknologi NFA lebih diminati.
            Beberapa sistem yang telah menggunakan teknologi NFA ini diantaranya adalah Perl, Java, .NET languages, PHP, Python, Ruby dan masih banyak lagi.
Belajar Regex memang susah diawal, tapi kalo sudah bisa akan sangat menyenangkan dan membantu pekerjaan kita sehari-hari. Tidak hanya  programmer saja perlu mengenal Regex, orang awam juga perlu karena manfaatnya bakalan besar sekali misalnya mencari file .doc, .pdf atau yang lainnya pada sistem operasi windows
D.    Dasar Teori Regex
            Salah satu fungsi yang dapat digunakan untuk operasi regex adalah:
Ø  ereg(string_pola, string_sumber);
fungsi ini akan menghasilkan TRUE, jika ternyata pola cocok dengan sumber dan FALSE jika keduanya tidak cocok. Pola dari fungsi di atas adalah rumus dari data text yang diinginkan. Cara membuat rumus canggih ini dengan menggunakan karakter meta. singkatnya meta itu adalah karakter yang memiliki arti tertentu. contoh pada perintah DOS adalah DIR *.*, karakter * tidak diartikan sebagai karakter bintang oleh komputer melainkan mempunyai arti khusus.
Ada beberapa karakater meta yang perlu di ketahui, yaitu :

·        Karakter meta | (Garis Vertikal)
Karakter | artinya menjadikan karakter meta text sebagai pilihan pada pola untuk di cocokan dengan sumber. Contoh: ereg(Uus | Lukman |Nanang, Lukman) Artinya akan TRUE karena Lukman adalah salah satu pilihan dari pola. namun jika sumbernya ternyata adalah Hasan, hasilnya akan FALSE alias tidak cocok, karena hasan tidak ada pada salah satu pilihan tersebut. ( dan ), karakter kurung buka dan kurung tutup karakter kurung buka dan kurung tutup berguna untuk mengelompokan beberapa kata atau data text agar dianggap menjadi suatu kesatuan. Contoh: ureg((Uus Musailini)|(Lukmanul Hakim)|Nanang, Lukmanul); Hasil penyataan regex di atas adalah FALSE alias tidak cocok , karena Lukmanul Hakim adalah satu kesatuan, sehingga tidak sama Lukmanul saja.
Tabel 1. pola umum pada regex
Pola
Penjelasan
[ ]
ekspresi kurung. cocok dengan satu karakter yang berada dalam kurung, misal: pattern "a[bcd]i" cocok dengan string
"abi", "aci", dan "adi". penggunaan range huruf dalam kurung diperbolehkan, misal : pattern "[a-z]" cocok dengan salah satu karakter diantara string "a" sampai "z". pattern [0-9] cocok dengan salah satu angka. jika ingin mencari karakter "-" juga, karakter tersebut harus diletakkan di depan atau di belakang kelompok, misal: "[abc-]".

[^ ]
cocok dengan sebuah karakter yang tidak ada dalam kurung, berlawanan dengan yang diatas. misal: pattern "[^abc]" cocok
dengan satu karakter apa saja kecuali "a", "b", "c".

?
cocok dengan nol atau satu karakter sebelumnya. misal: pattern "died?" cocok dengan string "die" dan "died".
+
cocok dengan satu atau lebih karakter sebelumnya. misal: "yu+k" cocok dengan "yuk", "yuuk", "yuuuk", dan seterusnya.

*
cocok dengan nol atau lebih karakter sebelumnya. misal: pattern "hu*p" cocok dengan string "hp", "hup", "huup" dan
seterusnya.

{x} 
cocok dengan karakter sebelumnya sejumlah x karakter. misal: pattern "[0-9]{3}" cocok dengan bilangan berapa saja
yang berukuran 3 digit.

{x,y} 
cocok dengan karakter sebelumnya sejumlah x hingga y karakter. misal: pattern "[a-z]{3,5}" cocok dengan semua
susunan huruf kecil yang terdiri dari 3 sampai 5 huruf.

!
jika diletakkan di depan pattern, maka berarti "bukan". misal pattern "!a.u" cocok dengan string apa saja kecuali string "alu", "anu", "abu", "asu", "aiu", dan seterusnya .

^
jika diletakkan di depan pattern, akan cocok dengan awal sebuah string.

( )
gruping. digunakan untuk mengelompokkan karakter - karakter menjadi single unit. string yang cocok dalan pattern yang berada dalam tanda kurung dapat digunakan pada operasi berikutnya. semacam variable.

\
escape character. mengembalikan fungsi metacharacter menjadi karakter biasa. pada beberapa system dapat berarti sebaliknya, yaitu metacharacter menggunakan escape
character didepannya .

$
 jika diletakkan di belakang pattern, akan
cocok dengan akhir sebuah string.

            Selain karakter meta di atas PHP juga menyediakan class karakter yang fungsinya sama dengan meta, beberapa class di PHP tersebut yaitu, [[:alpa]] akan berarti sembarang huruf, [[:digit]] akan mengwakilik angka, [[[:alnum]] akan berarti angka atau digit, [[:space]] akan berarti sembarang space, [[:upper]] akan berarti sembarang huruf kapital dan [[:lower]] akan berarti sembarang huruf kecil.

E.     BEBERAPA CONTOH PENGGUNAAN REGEX PADA C#

Ø  VALIDASI ALPHA NUMERIC di VB.Net dan C#
            Alpha Numeric itu artinya huruf (Alfabet A-Z) dan Angka(0-9). Validasi ini diperlukan jika kita ingin user menginputkan karakter-karakter hanya huruf dan angka saja. Contohnya plat nomor kendaraan, NPM (Nomor Pokok Mahasiswa), dll. Berikut ini cara membuatnya.
Berikut ini adalah step-step dalam membuatnya.
1.      Buka Microsoft Visual Studio caranya start -> run -> ketikkan devenv. Lalu buat project baru dengan nama :ValidAlphaNumeric seperti gambar berikut ini. 


            Jangan lupa pilih Windows Form Application dan pilih bahasa pemrograman sesuai keinginan Anda.
2.      Ubah properti Form 1 seperti berikut ini.

Object
Properties
Value
Form 1
Text
Validasi AlphaNumeric
StartPosition
CenterScreen
label1
Text
Masukan Data :
TextBox1
Name
txtData
Button1
Name
btnOk
Text
&OK

Sehingga tampilan Form1 jadi seperti gambar berikut ini:
3.      Saatnya Coding 
Untuk VB.Net:kode di btnOk_Click() :cara akses event ini cukup klik 2x btnOk. Lalu tambahkan kode seperti berikut.

Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
 MessageBox.Show(Regex.IsMatch(txtPlat.Text, "^[a-zA-Z0-9]*$").ToString())
 End Sub
Setelah  itu tambah kode Imports System.Text.RegularExpressions di baris paling atas hingga kode di form 1 menjadi seperti berikut ini.

1
2
3
4
5
6
7
8
Imports System.Text.RegularExpressions

Public Class Form1

Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
 MessageBox.Show(Regex.IsMatch(txtPlat.Text, "^[a-zA-Z0-9]*$").ToString())
 End Sub
 End Class

Penjelasan Kode :

- Baris ke 1 : Sertakan namespace Regular Expression.
- Baris ke 6 : Cek Apakah yang diisikan di txtPlat.txt itu sesuai dengan pernyataan regular expression ini ^[a-zA-Z0-9]$.
Maksud dari pernyataan RegEx (Regular Expression) tadi adalah:
* ^ : memulai pernyataan regular expression
* [a-zA-Z0-9] : Karakter yang diizinkan adalah a kecil sampai z kecil, A besar sampai Z besar, angka 0 sampai 9
* $ : akhir dari pernyataan Regex
Untuk C# :
kode di btnOk_Click() :
cara akses event ini cukup klik 2x btnOk. Lalu tambahkan kode seperti berikut.
1
2
3
4
private void btnOK_Click(object sender, EventArgs e)
{
MessageBox.Show(Regex.IsMatch(txtPlat.Text, "^[a-zA-Z0-9]*$").ToString());
}

Setelah itu tambah kode using System.Text.RegularExpressions; di baris paling atas hingga kode di form 1 menjadi seperti berikut ini.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
 using System.Text.RegularExpressions;
 using System.Windows.Forms;

namespace ValidAlphaNumeric
 {
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }

private void btnOK_Click(object sender, EventArgs e)
 {
 MessageBox.Show(Regex.IsMatch(txtPlat.Text, "^[a-zA-Z0-9]*$").ToString());
 }
 }
 }
Penjelasan Kode sama dengan penjelasan kode VB.Net

4.      Hasilnya
Ketika program ini dijalankan dan di klik OK maka program akan cek isi dari txtData.txt dan menampilkan messagebox berisikan True (Jika Sesuai) atau False(Tidak sesuai)Jika yang diinputkan sembarang karakter (alphanumeric + karakter lainnya.

 Jika yang diinputkan AlphaNumeric:

Ø  Langkah –langkah menggunakan regex untuk menentukan apakah string cocok pola tertentu
langkah-langkah ini menunjukkan Anda bagaimana untuk membuat dan menggunakan regex untuk menentukan apakah string cocok pola tertentu. Regular expressions memungkinkan untuk mudah parsing dan pencocokan string untuk pola tertentu. Menggunakan benda-benda yang tersedia dalam RegularExpressions namespace, Anda dapat membandingkan string terhadap pola yang diberikan, mengganti pola string dengan string lainnya, atau mengambil hanya bagian dari string diformat.Dalam contoh ini, kita akan membangun sebuah pola untuk memvalidasi alamat e-mail.
Daftar berikut menguraikan fitur perangkat keras, perangkat lunak, infrastruktur jaringan, dan paket layanan yang Anda butuhkan:
·         Microsoft Visual C#
Artikel ini mengasumsikan bahwa Anda sudah familiar dengan berikut topik:
·         Visual C#
·         Sintaks ekspresi reguler

Menggunakan regular expressions untuk mencocokkan pola:

1.      Mulai Visual C#.
2.      Membuat Visual C# konsol aplikasi baru.
3.      Menentukan kata kunci menggunakan Text.RegularExpressions namespace sehingga Anda tidak akan diminta untuk memenuhi syarat deklarasi tersebut namespaces kemudian dalam kode Anda. Pernyataan menggunakan harus digunakan sebelum setiap Deklarasi lain:
using System.Text.RegularExpressions;
                                 
4.      Menentukan kalimat biasa baru yang akan menggunakan pola cocok untuk memvalidasi alamat e-mail. Kalimat biasa berikut ini disusun untuk mencapai tiga hal:
a.       Menangkap substring sebelum @ simbol dan memasukkan ke dalam kelompok "pengguna".
b.      Menangkap substring setelah @ simbol dan memasukkan ke dalam kelompok "host".
c.       Pastikan bahwa semester string tidak memiliki simbol @.
Regex emailregex = new Regex("(?<user>[^@]+)@(?<host>.+)");
                                 
   Mendefinisikan string baru yang berisi alamat e-mail yang valid. Ini memberikan nilai default jika argumen baris perintah metode yang kosong:
String s = "johndoe@tempuri.org";
                                 
   Periksa untuk melihat apakah ada parameter baris perintah; Jika ada, mengambil parameter pertama dan menetapkannya ke variabel "s".
if ( args.Length > 0 ) {
  s = args[0];
}
                                 
   Menggunakan metode pertandingan untuk lulus dalam variabel alamat e-mail dan kembali pertandingan baru objek.Objek pertandingan akan kembali terlepas dari Apakah setiap pertandingan yang ditemukan dalam sumber string.
Match m = emailregex.Match(s);
                                                                  
   Dengan memeriksa properti sukses , kita bisa memutuskan apakah akan melanjutkan pengolahan objek pertandingan atau untuk mencetak pesan kesalahan. Jika berhasil, menampilkan "pengguna" dan "host" bernama kelompok dalam kelompokkoleksi objek pertandingan .
if ( m.Success ) {
  Console.WriteLine("User: " + m.Groups["user"].Value);
  Console.WriteLine("Host: " + m.Groups["host"].Value);
 } else {
  Console.WriteLine(s + " is not a valid email address");
}
Console.WriteLine();
                                 
   Untuk menjaga jendela konsol terbuka setelah menjalankan aplikasi, tambahkan baris berikut kode:
System.Console.WriteLine("Press Enter to Continue...");
System.Console.ReadLine();
                                 
   Membangun proyek Anda.
   Untuk menjalankan aplikasi dari lingkungan development yang menggunakan alamat e-mail default yang ditentukan dalam kode, tekan F5 atau pilih mulai dari Debug menu. Untuk memulai aplikasi dengan argumen baris perintah, ada tiga pilihan:
o    Pada Project menu, klik properti, dan kemudian klik Debug. Di bagian Pilihan mulai dalam pane kanan, menentukan alamat e-mail yang Anda ingin menguji. Tekan F5, atau klik mulai pada menu Debug untuk menjalankan aplikasi.
Di Visual C# .NET 2003:Pada
 Project menu, klik properti. Dalam pane kiri, klik Konfigurasi properti folder, dan kemudian klik Debugging. Di bawah Mulai pilihan, klik Argumen baris perintah dan menentukan alamat e-mail yang Anda inginkan untuk menguji. Tekan F5 atau pilih mulai dari menu Debug untuk menjalankan aplikasi.
o    Mulai jendela perintah dan arahkan ke folder "bin\debug" di bawah folder di mana proyek Anda berada. Kemudian ketik nama executable diikuti dengan alamat e-mail yang ingin Anda tes.
o    Menemukan file eksekusi untuk proyek ini, dan seret ke awal...Run window pada taskbar. Tambahkan alamat e-mail untuk memverifikasi, dan klik atau tekan OK.

Ø  Cara Menvalidasi Email Menggunakan Regex pada C#

Pada Form tertentu biasanya kita sering menemukan  pengisian form yang mewajibkan mengisi email dengan syarat @yahoo.com , @ hotmail.com dan @gmail.com . Cara menvalidasinya adalah menggunakan regex atau Regular Expression. Berikut ini adalah langkah – langkahnya:

1.Tambahkan koding ini pada deretan baris paling atas
using System.Text.RegularExpressions;
2.  Double klik pada submit button yang ada pada form yang bersangkutan sehingga kitadapat memulai koding. Contoh soal : email harus berupa @yahoo.com atau @hotmail.com
  private void button1_Click(object sender, EventArgs e)
    {
    Regex R = new Regex ("^+\\w+@+(yahoo\\.com | hotmail\\.com)+$");
    if (R.IsMatch(textBox1.Text))
      {
       MessageBox.Show ("Email yang anda masukkan benar");
      }
     else
     {
       MessageBox.Show ("Email yang anda masukkan salah");  
   }

Catatan :
Untuk pengecekan di atas, digunakan “^\\w+$”. Yang berarti :
§  \\w = huruf atau angka
§  + = untuk menyatakan bahwa \\w harus ada minimal 1
§  Kedua simbol di atas di kelilingi oleh “^…..$”, yang menandai awal dan akhir dari inputan.

F.     Keuntungan dan Kekurangan Menggunakan RegEx
Keuntungan menggunakan REGEXP ini adalah,pemirsa sama sekali tidak dibatasi dalam pencarian yang berdasarkan string seperti halnya pada operator LIKE. dan penggunaan REGEX bisa memperpendek penulisan statement perintah Mysql terutama yang menggunakan AND dan OR pada klausa WHERE.
Ada keuntungan ada pula kerugian, Kerugiannya adalah penggunaan REGEX sedikit sulit dimengerti dan dimaintain jika memiliki pattern yang kompleks. misal ada sebuah string dengan nilai 1000AA7B-X1.221, jika ada nilai dengan kondisi konstan misal 1000AA7B-X2.221,1000AA7B-X3.221 dst maka ini mudah saja untuk mensetting pattern yang sesuai, namun jika tiba-tiba berubah menjadi 1000AA7B-X11.221 tentu ini diperlukan perubahan pada desain pattern. Kerugian berikutnya adalah penurunan performa mysql jika pattern tidak dilakukan pada table yang ber-index.
Referensi:



1 komentar:

  1. Assalamualaikum
    Maaf, saya sama sekali tidak bisa membaca artikel Anda ini.
    Menurut saya, kombinasi warna yang Anda gunakan tidak userfriendly

    BalasHapus