7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Go

Regular Expressions Dengan Go: Bagian 1

Read Time: 7 mins
This post is part of a series called Regular Expressions With Go.
Regular Expressions With Go: Part 2

Indonesian (Bahasa Indonesia) translation by Febri Ardian Sanjoyo (you can also view the original English article)

Ekspresi reguler (AKA regex) adalah bahasa formal yang mendefinisikan urutan karakter dengan beberapa pola. Di dunia nyata, mereka dapat digunakan untuk menyelesaikan banyak masalah dengan semi-structured text. Anda dapat mengekstrak bits dan pieces penting dari teks dengan banyak dekorasi atau konten yang tidak terkait. Go memiliki paket regex yang kuat di library standarnya yang memungkinkan Anda memilah dan memotong teks dengan regexes.

Dalam seri dua bagian ini, Anda akan belajar apa regular expression dan cara menggunakan regular expression secara efektif di Go untuk menyelesaikan banyak tugas umum. Jika Anda tidak terbiasa dengan regular expression, ada banyak tutorial hebat. Ini salah satu yang bagus.

Memahami  Regular Expression

Mari kita mulai dengan contoh cepat. Anda memiliki beberapa teks, dan Anda ingin memeriksa apakah itu berisi alamat email. Alamat email ditentukan secara ketat di RFC 822. Singkatnya, ia memiliki bagian lokal diikuti oleh simbol @ diikuti oleh domain. Alamat email akan dipisahkan dari sisa teks berdasarkan spasi.

Untuk mengetahui apakah itu berisi alamat email, regex berikut akan melakukan: ^\w+@\w+\.\W+$. Perhatikan bahwa regex ini sedikit permisif dan akan memungkinkan beberapa alamat email yang tidak valid lolos. Tapi itu cukup bagus untuk mendemonstrasikan konsepnya. Mari kita coba pada beberapa alamat email potensial sebelum menjelaskan cara kerjanya:

Ekspresi reguler kami berfungsi pada contoh kecil ini. Dua alamat pertama ditolak karena domain tidak memiliki titik atau tidak memiliki karakter apa pun setelah titik. Email ketiga diformat dengan benar. Kandidat terakhir memiliki dua simbol @.

Mari kita pecahkan regex ini: ^\w+@\w+\.\W+$

Makna Character/Symbol
^ Mulai dari text target
\w Setiap karakter kata [0-9A-Za-z_]
+ Setidaknya satu dari karakter sebelumnya
@ Secara harfiah karakter @
\. Karakter dot literal. Harus lolos dengan \
$ Akhir dari text target

Secara keseluruhan, regex ini akan mencocokkan potongan-potongan teks yang dimulai dengan satu atau lebih karakter kata, diikuti oleh karakter "@", diikuti lagi oleh satu atau lebih karakter kata, diikuti oleh sebuah titik dan diikuti oleh satu lagi atau lebih karakter kata.

Berurusan Dengan Karakter Khusus

Karakter berikut memiliki arti khusus dalam ekspresi regular:.+*?()|[]{}^$\. Kami telah melihat banyak dari mereka dalam contoh email. Jika kita ingin mencocokkannya secara literally, kita harus menghindarinya dengan backslash. Mari kenalkan fungsi helper kecil yang disebut match() yang akan menghemat banyak pengetikan. Dibutuhkan pola dan beberapa teks, menggunakan metode regexp.Match() untuk mencocokkan pola ke teks (setelah mengonversi teks ke susunan byte), dan mencetak hasilnya:

Berikut ini contoh pencocokan karakter biasa seperti z vs. mencocokkan karakter khusus seperti:

Pola regex \? berisi backslash yang harus diloloskan dengan backslash lain ketika direpresentasikan sebagai string Go reguler. Alasannya adalah bahwa backslash juga digunakan untuk melepaskan karakter khusus dalam string Go seperti newline (\n). Jika Anda ingin mencocokkan karakter backslash itu sendiri, Anda akan membutuhkan empat garis miring!

Solusinya adalah dengan menggunakan raw string Go dengan backtick (`), bukan tanda kutip ganda. Tentu saja, jika Anda ingin mencocokkan karakter newline, Anda harus kembali ke string biasa dan menangani beberapa backslash keluar.

Placeholder dan Pengulangan

Dalam banyak kasus, Anda tidak mencoba untuk benar-benar cocok dengan urutan karakter tertentu seperti "abc", tetapi urutan panjang yang tidak diketahui dengan mungkin beberapa karakter yang dikenal disuntikkan di suatu tempat. Regexes mendukung case penggunaan ini dengan dot. karakter khusus yang mewakili karakter apa pun. * Karakter khusus mengulangi karakter sebelumnya (atau grup) nol atau beberapa kali. Jika Anda menggabungkannya, seperti di.*, Maka Anda cocok dengan apa pun karena itu hanya berarti nol atau lebih banyak karakter. Tanda + sangat mirip dengan *, tetapi cocok dengan satu atau lebih karakter atau grup sebelumnya. Jadi.+ Akan cocok dengan semua text yang tidak kosong.

Menggunakan Batas

Ada tiga jenis batasan: permulaan teks yang dilambangkan oleh ^, akhir teks yang dilambangkan dengan $, dan batas kata yang dilambangkan oleh \b. Misalnya, perhatikan teks ini dari film klasik The Princess Bride: "My name is Inigo Montoya. You killed my father. Bersiaplah untuk mati. "Jika Anda hanya cocok dengan" father "Anda mendapatkan kecocokan, tetapi jika Anda mencari" father "di akhir teks, Anda perlu menambahkan karakter $, dan kemudian tidak akan ada kecocokan. Di sisi lain, mencocokkan "Hello" di awal berfungsi dengan baik.

Batas kata melihat setiap kata. Anda dapat memulai dan/atau mengakhiri pola dengan \b. Perhatikan bahwa tanda baca seperti koma dianggap sebagai batas dan bukan bagian dari kata. Berikut beberapa contohnya:

Menggunakan Kelas

Seringkali berguna untuk memperlakukan semua group karakter bersama seperti semua digit, karakter spasi, atau semua karakter alphanumeric. Golang mendukung kelas POSIX, yaitu:

Character Class Meaning
[:alnum:]
alphanumeric (≡ [0-9A-Za-z])
[:alpha:]
alphabetic (≡ [A-Za-z])
[:ascii:]
ASCII (≡ [\x00-\x7F])
[:blank:]
blank (≡ [\t ])
[:cntrl:]
control (≡ [\x00-\x1F\x7F])
[:digit:]
digits (≡ [0-9])
[:graph:]
graphical (≡ [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])
[:lower:]
lower case (≡ [a-z])
[:print:]
printable (≡ [ -~] == [ [:graph:]])
[:punct:]
punctuation (≡ [!-/:-@[-`{-~])
[:space:]
whitespace (≡ [\t\n\v\f\r ])
[:upper:]
upper case (≡ [A-Z])
[:word:]
word characters (≡ [0-9A-Za-z_])
[:xdigit:]
hex digit (≡ [0-9A-Fa-f])

Dalam contoh berikut, saya akan menggunakan kelas [: digit:] untuk mencari angka dalam teks. Juga, saya tunjukkan di sini cara mencari jumlah karakter yang tepat dengan menambahkan nomor yang diminta dalam kurung kurawal.

Anda dapat menentukan kelas Anda sendiri juga dengan menempatkan karakter dalam tanda kurung siku. Misalnya, jika Anda ingin memeriksa apakah beberapa teks merupakan rangkaian DNA yang valid yang hanya berisi karakter ACGT, maka gunakan ^[ACGT]*$ regex:

Menggunakan Alternatif

Dalam beberapa kasus, ada beberapa alternatif yang layak. HTTP URLs yang cocok dapat dicirikan oleh skema protokol, yang baik https:// atau https://. Karakter pipe | memungkinkan Anda memilih di antara alternatif. Berikut ini adalah regex yang akan mengurutkannya: (http)|(https)://\w+\.\W{2,}. Ini diterjemahkan ke string yang dimulai dengan http:// atau https:// diikuti oleh setidaknya satu karakter kata diikuti oleh titik diikuti oleh setidaknya dua karakter kata.

Kesimpulan

Di bagian tutorial ini, kita membahas banyak hal dan belajar banyak tentang regular expression, dengan contoh langsung menggunakan library regexp Golang. Kita fokus pada pure matching dan bagaimana mengekspresikan niat kita menggunakan regular expression.

Di bagian dua, kita akan fokus menggunakan regular expression untuk bekerja dengan teks, termasuk pencarian fuzzy, penggantian, pengelompokan, dan menangani baris baru.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Scroll to top
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.