Kelas karakter

Kelas karakter \d, \w, dan \s beserta kebalikannya, negasi, dan kelas khusus untuk pola yang lebih ringkas.

Daftar isi

Kelas karakter (character class) adalah notasi yang mencocokkan satu karakter dari sekumpulan karakter tertentu, sehingga pola tidak perlu menuliskan semua kemungkinannya satu per satu. Perl menyediakan kelas siap pakai seperti \d, \w, dan \s beserta kebalikannya, serta kelas buatan sendiri dalam tanda kurung siku. Topik ini membahas keduanya, ditambah pemakaian quantifier pada kelas karakter, agar pola menjadi lebih ringkas dan tepat sasaran.

\d, \w, dan \s beserta kebalikannya#

Tiga kelas siap pakai mencakup kebutuhan paling sering. Kelas \d mencocokkan satu digit, \w mencocokkan satu karakter kata, yaitu huruf, angka, atau garis bawah, sedangkan \s mencocokkan satu karakter spasi, tab, atau baris baru. Setiap kelas memiliki kebalikan dengan huruf kapital, yaitu \D, \W, dan \S, yang mencocokkan satu karakter di luar kelompoknya. Skrip berikut menguji ketiga pasang kelas tersebut terhadap tiga string berbeda:

perl kelas-dasar.pl
#!/usr/bin/env perl
use strict;
use warnings;

my @baris = ("Ruang 204-A", "204", "   ");

foreach my $b (@baris) {
    print "[$b]\n";
    print "  ada digit         : ya\n" if $b =~ m/\d/;
    print "  ada karakter kata : ya\n" if $b =~ m/\w/;
    print "  ada spasi         : ya\n" if $b =~ m/\s/;
    print "  ada selain digit  : ya\n" if $b =~ m/\D/;
    print "  ada selain kata   : ya\n" if $b =~ m/\W/;
    print "  ada selain spasi  : ya\n" if $b =~ m/\S/;
}
text Keluaran
[Ruang 204-A]
  ada digit         : ya
  ada karakter kata : ya
  ada spasi         : ya
  ada selain digit  : ya
  ada selain kata   : ya
  ada selain spasi  : ya
[204]
  ada digit         : ya
  ada karakter kata : ya
  ada selain spasi  : ya
[   ]
  ada spasi         : ya
  ada selain digit  : ya
  ada selain kata   : ya

String 204 lolos uji digit dan karakter kata tetapi gagal pada uji \D karena seluruh isinya digit. Sebaliknya, string berisi tiga spasi hanya lolos uji \s, \D, dan \W. Tanda hubung pada Ruang 204-A juga masuk golongan \W, karena karakter kata tidak mencakup tanda baca. Perlu dicatat bahwa \w mencakup garis bawah, sehingga skor_akhir dianggap sepenuhnya tersusun dari karakter kata.

Kelas-kelas ini paling sering dipadukan dengan quantifier, misalnya \d+ untuk deretan digit, tetapi bentuk tunggalnya sudah cukup untuk pengujian keberadaan. Pengujian keberadaan juga menjadi pintu masuk validasi ringan, yaitu menolak data yang formatnya jelas salah sebelum diproses lebih lanjut. Pada skrip di atas, tanda kurung siku dalam [$b] hanyalah cara menampilkan batas string pada keluaran, dan tanda itu bukan bagian dari kelas karakter.

Kelas dalam tanda kurung siku#

Kelas buatan sendiri ditulis dalam tanda kurung siku, misalnya [abc] yang mencocokkan satu huruf a, b, atau c. Rentang ditulis dengan tanda hubung, sehingga [A-C] setara dengan [ABC] dan [0-9] setara dengan \d pada string ASCII. Pencocokan peka huruf besar dan kecil, sehingga [A-C] tidak mencocokkan a. Tanda ^ di awal kelas berarti negasi, yaitu satu karakter di luar anggota kelas tersebut. Skrip berikut menguji kelas buatan pada kode ruang:

perl kelas-kurung.pl
#!/usr/bin/env perl
use strict;
use warnings;

my @kode = ("A1", "B2", "C3", "D1", "a1");

foreach my $k (@kode) {
    my @uraian;
    push @uraian, "awal A-C" if $k =~ m/^[A-C]/;
    push @uraian, "ujung 1-2" if $k =~ m/[12]$/;
    next unless @uraian;
    print "$k : ", join(", ", @uraian), "\n";
}

# ^ di awal kelas berarti negasi, bukan anchor
print "C4 memuat karakter di luar A-C dan 1-3\n" if "C4" =~ m/[^A-C1-3]/;
text Keluaran
A1 : awal A-C, ujung 1-2
B2 : awal A-C, ujung 1-2
C3 : awal A-C
D1 : ujung 1-2
a1 : ujung 1-2
C4 memuat karakter di luar A-C dan 1-3

Kode a1 hanya lolos uji ujung karena huruf kecil tidak termasuk rentang A-C, sedangkan D1 gagal pada uji awal karena D berada di luar rentang itu. Pada baris terakhir, kelas [^A-C1-3] mencocokkan karakter apa pun di luar A sampai C dan 1 sampai 3, sehingga digit 4 pada C4 lolos. Makna ^ berbeda menurut posisinya, yaitu anchor ketika berada di luar kelas dan negasi ketika berada tepat di awal kelas.

Anggota kelas tidak harus berupa huruf atau angka, karena tanda baca dan spasi juga sah sebagai anggota, misalnya [,:] untuk koma atau titik dua. Karakter khusus seperti . dan * kehilangan makna metakarakternya di dalam kelas, sehingga [.] mencocokkan titik literal. Hanya sedikit karakter yang perlu perlakuan khusus di dalam kelas, yaitu ], \, ^ di awal, dan - pada posisi yang membuatnya terbaca sebagai rentang.

Quantifier pada kelas karakter#

Kelas karakter boleh diberi quantifier seperti karakter biasa, sehingga [A-Z]+\d+ berarti satu huruf besar atau lebih diikuti satu digit atau lebih. Kombinasi ini menjadi cara ringkas untuk memeriksa format, misalnya kode yang harus tersusun dari huruf besar lalu digit. Perhatikan bahwa quantifier hanya berlaku pada karakter atau kelas yang berada tepat di depannya, sehingga urutan yang diulang secara bersama memerlukan pengelompokan terlebih dahulu. Skrip berikut memvalidasi beberapa kode dengan pola semacam itu:

perl validasi.pl
#!/usr/bin/env perl
use strict;
use warnings;

my @kode = ("AB12", "A12", "AB1X", "ab12");

foreach my $k (@kode) {
    # satu huruf besar atau lebih diikuti satu digit atau lebih
    if ($k =~ m/^[A-Z]+\d+$/) {
        print "Valid  : $k\n";
    } else {
        print "Ditolak: $k\n";
    }
}
text Keluaran
Valid  : AB12
Valid  : A12
Ditolak: AB1X
Ditolak: ab12

Kode AB1X ditolak karena X bukan digit, sedangkan ab12 ditolak karena hurufnya kecil. Anchor ^ dan $ mengunci format agar tidak ada karakter lain sebelum atau sesudahnya. Tanpa kedua anchor tersebut, pola yang sama akan menerima xxAB12zz karena cukup menemukan potongan yang cocok di tengah string.

Pola [A-Z]+\d+ menerima berapa pun huruf dan digit, sehingga A12 dan ABCD999 sama-sama lolos. Bila jumlahnya harus dikunci, Perl menyediakan quantifier rentang seperti [A-Z]{3} untuk tepat tiga huruf, yang menggantikan jumlah berapa pun dengan aturan yang pasti. Untuk kode pendek, perbedaan ini terasa kecil, tetapi pada data dalam jumlah banyak, validasi yang longgar membuat data tidak valid lolos tanpa terdeteksi.

Memilih kelas yang tepat#

Kelas siap pakai dan kelas buatan saling melengkapi, dan pilihannya menentukan seberapa jelas maksud pola terbaca. Tabel berikut merangkum padanan dan perbedaannya pada string ASCII:

KebutuhanKelas siap pakaiKelas buatan
Satu digit\d[0-9]
Satu karakter kata\w[A-Za-z0-9_]
Satu karakter spasi\s[ \t\n]
Satu huruf besar atau keciltidak tersedia[A-Za-z]
Karakter di luar digit\D[^0-9]

Kelas siap pakai lebih ringkas dan maknanya baku di seluruh pola Perl, sedangkan kelas buatan diperlukan ketika anggotanya tidak tercakup, misalnya [A-Za-z] untuk huruf saja atau [aeiou] untuk huruf vokal. Untuk \s, penulisan [ \t\n] hanya mencakup spasi, tab, dan baris baru, sedangkan \s menanggung beberapa karakter spasi lain. Karena itu \s lebih aman untuk teks bebas, dan kelas buatan lebih tepat untuk aturan yang ketat.

Keterbacaan juga menjadi pertimbangan pada pilihan ini. Pola [0-9] dan \d menghasilkan kecocokan yang sama, tetapi \d langsung menyatakan niatnya, sedangkan rentang buatan perlu ditafsirkan oleh pembaca pola. Sebaliknya, kelas siap pakai tidak menyediakan bentuk untuk aturan yang lebih sempit, misalnya digit yang bukan nol, sehingga pengecualian semacam itu hanya dapat dinyatakan melalui kelas buatan seperti [1-9]. Dengan demikian, pemilihan kelas mempertimbangkan dua hal sekaligus, yaitu ketepatan aturan dan kejelasan pola bagi pembacanya.

Ringkasan#

  • \d, \w, dan \s mencocokkan digit, karakter kata, dan karakter spasi, sedangkan \D, \W, dan \S mencocokkan kebalikannya.
  • Kelas buatan [abc] mencocokkan satu anggotanya, rentang [a-z] merangkum banyak anggota, dan [^abc] mencocokkan satu karakter di luar anggota.
  • Tanda ^ berarti anchor di luar kelas dan negasi di awal kelas, sedangkan pencocokan tetap peka huruf besar dan kecil.
  • Quantifier dapat ditempelkan pada kelas, dan kombinasi kelas, quantifier, serta anchor ^ dan $ menjadi pola validasi format yang ringkas.

Referensi#