Pustaka string menghimpun fungsi bawaan untuk mencari, memotong, mengganti, dan memformat teks dalam Lua. Topik ini membahas fungsi yang digunakan setiap hari, yaitu find, match, gmatch, gsub, dan format, ditambah fungsi dasar len, sub, upper, lower, serta rep. Bagian inti topik ini adalah pola pencocokan (pattern matching), yaitu bahasa kecil untuk mendeskripsikan bentuk teks yang dicari. Pola Lua sering disamakan dengan regex, padahal keduanya berbeda secara mendasar, sehingga perbedaan itu dibahas secara eksplisit. Setelah topik ini, baris tanggal, log sensor, dan daftar kata dapat diolah lengkap dengan pustaka standar tanpa pustaka pihak ketiga.
Fungsi dasar pustaka string#
Pustaka string dapat dipanggil lewat notasi titik, misalnya string.upper(s), maupun lewat notasi titik dua, misalnya s:upper(). Keduanya setara, karena notasi titik dua hanya menyembunyikan argumen pertama. Fungsi string.len mengembalikan panjang string dan memberikan hasil yang sama dengan operator #. Fungsi string.sub(s, i, j) mengambil potongan dari posisi i sampai j, dan indeks dimulai dari 1, bukan 0. Indeks negatif dihitung dari akhir, sehingga s:sub(-6) mengambil enam karakter terakhir.
Fungsi upper dan lower mengubah huruf besar menjadi huruf kecil dan sebaliknya, sedangkan rep mengulang string beberapa kali sesuai argumen keduanya. Blok kode berikut menggunakan kelimanya sekaligus pada satu string yang sama.
local s = "Latihan Pustaka String"
print(s:upper())
print(s:lower())
print(#s)
print(s:sub(9, 15))
print(("ab"):rep(3))LATIHAN PUSTAKA STRING
latihan pustaka string
22
Pustaka
abababNilai #s adalah 22 karena spasi juga dihitung sebagai karakter. Potongan sub(9, 15) menghasilkan “Pustaka” karena huruf P menempati posisi kesembilan. Indeks berbasis 1 ini menjadi dasar untuk membaca posisi yang dikembalikan oleh find pada bagian berikutnya.
Pola pencocokan yang bukan regex#
Pola Lua adalah bahasa pencocokan yang sengaja dibuat kecil, berbeda dari regex, yakni notasi pencocokan teks yang lazim digunakan bahasa lain seperti Perl dan JavaScript. Lua menandai karakter khusus dengan % alih-alih \, tidak menyediakan alternasi |, dan tidak mendukung lookahead. Pola yang disalin mentah dari tutorial regex karenanya sering gagal dicocokkan.
Bentuk terkecil dari pola adalah karakter biasa yang dicocokkan apa adanya, sedangkan kekuatannya terletak pada kelas karakter dan kuantifikator (quantifier), yaitu penanda jumlah kemunculan. Sebelum membahas keduanya, blok kode berikut menunjukkan jangkar (anchor) ^ dan $, yang membatasi pencocokan pada posisi awal dan akhir string.
print(string.match("Indonesia", "^Indo"))
print(string.match("Indonesia", "nesia$"))
print(string.match("Indonesia", "^nesia"))Indo
nesia
nilDua baris pertama berhasil karena polanya mencocokkan posisi yang tepat, sedangkan baris ketiga bernilai nil karena string tidak diawali “nesia”. Kelas karakter yang tersedia dirangkum pada tabel berikut.
| Kelas | Yang dicocokkan | Contoh kecocokan |
|---|---|---|
%d | Angka | 42 |
%a | Huruf | Kelas |
%s | Spasi kosong | |
%w | Huruf atau angka | R12 |
%u | Huruf besar | A |
%l | Huruf kecil | a |
%p | Tanda baca | - |
. | Sembarang karakter | x |
Kelas dapat digabungkan menjadi himpunan dengan tanda kurung siku, misalnya [%a%d] mencocokkan huruf maupun angka, sedangkan [^%s] mencocokkan semua yang bukan spasi kosong. Kuantifikatornya empat macam, yaitu + untuk satu kali atau lebih, * untuk nol kali atau lebih secara serakah, - untuk nol kali atau lebih secara hemat, dan ? untuk nol kali atau satu kali. Kuantifikator serakah mengambil kemunculan sepanjang mungkin, sedangkan kuantifikator hemat berhenti pada kecocokan pertama yang mungkin. Tanda kurung di dalam pola membentuk capture, yakni bagian yang menangkap potongan teks, dan penggunaannya dibahas pada bagian berikutnya.
Mencari posisi dengan string.find#
Fungsi string.find(s, pola) mencari kemunculan pertama pola pada s dan mengembalikan dua nilai, yaitu posisi awal dan posisi akhir kecocokannya. Apabila tidak ada kecocokan, fungsi mengembalikan nil. Karena argumen keduanya dibaca sebagai pola, karakter khusus seperti - kehilangan arti harfiahnya. Untuk mencari teks apa adanya, sediakan argumen keempat plain bernilai true atau awali karakter khusus dengan %.
local s = "Arsip-2026-catatan.txt"
local awal, akhir = string.find(s, "2026")
print(awal, akhir)
print(s:sub(awal, akhir))
print(string.find(s, "2026%-catatan"))
print(string.find(s, "2026-catatan", 1, true))
print(string.find(s, "2026-catatan"))7 10
2026
7 18
7 18
nilBaris pertama menunjukkan bahwa find mengembalikan dua nilai, yaitu 7 dan 10, sehingga sub(awal, akhir) menghasilkan “2026”. Baris kedua dan ketiga memberikan hasil yang sama, 7 dan 18, karena pola 2026%-catatan dan pencarian polos atas 2026-catatan sama-sama mencari teks harfiah. Baris keempat bernilai nil karena tanpa % dan tanpa plain, tanda - pada pola dibaca sebagai kuantifikator hemat yang menempel pada karakter 6.
Menangkap potongan teks dengan capture#
Capture adalah potongan pola yang ditulis dalam tanda kurung dan menangkap teks yang berhasil dicocokkan. Fungsi string.match mengembalikan seluruh nilai capture sebagai nilai balik ganda, sedangkan find mengembalikannya setelah posisi awal dan akhir. Skrip berikut tersimpan sebagai pisah-tanggal.lua di bundle topik ini.
-- Memecah tanggal "2026-11-06" menjadi komponen dengan capture
local tanggal = "2026-11-06"
local tahun, bulan, hari = string.match(tanggal, "(%d+)-(%d+)-(%d+)")
print("Tahun: " .. tahun)
print("Bulan: " .. bulan)
print("Hari : " .. hari)Tahun: 2026
Bulan: 11
Hari : 06Pola (%d+)-(%d+)-(%d+) berbunyi satu grup angka, tanda hubung, grup angka kedua, tanda hubung, lalu grup angka ketiga. Grup (%d+) menangkap satu atau lebih angka, sedangkan tanda - yang berada tepat setelah kuantifikator + dibaca sebagai karakter biasa. Hasil capture disimpan ke tiga variabel sekaligus karena match mengembalikannya sebagai nilai balik ganda, sehingga komponen tanggal siap digunakan untuk perhitungan atau penyimpanan.
Menghitung kata dengan gmatch#
Fungsi string.gmatch(s, pola) mengembalikan iterator, yakni fungsi yang menghasilkan satu kecocokan pada setiap langkah perulangan. Pasangan gmatch dan pola %a+ menjadi idiom standar untuk menjelajahi kata demi kata, karena setiap deretan huruf dianggap satu kata dan spasi serta tanda baca menjadi pemisahnya. Skrip berikut menghitung kata pada satu catatan dan mencari kata terpanjangnya dalam perulangan yang sama.
-- Menghitung kata dan mencari kata terpanjang dengan gmatch
local catatan = "Sensor suhu kelas mencatat kenaikan dua derajat pagi ini"
local jumlah = 0
local terpanjang = ""
for kata in string.gmatch(catatan, "%a+") do
jumlah = jumlah + 1
if #kata > #terpanjang then
terpanjang = kata
end
end
print("Jumlah kata : " .. jumlah)
print("Kata terpanjang : " .. terpanjang)Jumlah kata : 9
Kata terpanjang : mencatatCatatan di atas berisi sembilan kata, dan kata terpanjangnya adalah “mencatat”. Kata “kenaikan” sama panjangnya, tetapi tidak menggantikan pemegang gelar karena pembandingnya adalah lebih panjang, bukan lebih panjang atau sama. Apabila kata perlu dinormalisasi lebih dahulu, misalnya dijadikan huruf kecil semua, lower dapat dipanggil pada setiap kata di dalam perulangan tersebut.
Mengganti teks dengan gsub#
Fungsi string.gsub(s, pola, pengganti) mengganti setiap kecocokan pola dengan teks pengganti dan mengembalikan dua nilai, yaitu string hasil dan jumlah penggantian yang dilakukan. Nilai kedua berguna untuk menghitung kejadian, misalnya menghitung berapa kali sebuah label muncul pada baris log. Penggantinya dapat berupa string, table, maupun fungsi, tetapi bentuk string sudah mencakup banyak kebutuhan normalisasi.
-- Menormalisasi baris log sensor suhu dengan gsub
local log = "suhu=28.5C suhu=29.0C suhu=27.8C"
local rapih, jumlah = log:gsub("suhu=", "suhu ")
print(rapih)
print("Penggantian yang dilakukan: " .. jumlah)
local catatan = "piket hari Jumat"
local rapat, n = catatan:gsub("%s+", " ")
print(rapat)
print("Perbaikan spasi: " .. n)suhu 28.5C suhu 29.0C suhu 27.8C
Penggantian yang dilakukan: 3
piket hari Jumat
Perbaikan spasi: 2Pada baris pertama, pola suhu= diganti dengan suhu sebanyak tiga kali, dan jumlah itu tersimpan pada variabel jumlah. Pada baris ketiga, kuantifikator %s+ merapatkan deretan spasi menjadi satu spasi, dan gsub melaporkan dua perbaikan. Pemisahan dua nilai balik ke dua variabel sekaligus meniadakan kebiasaan yang keliru, yaitu membiarkan print(log:gsub(pola, pengganti)) mencetak string hasil dan angka jumlah pada satu baris yang sama.
Memformat keluaran dengan string.format#
Fungsi string.format menyusun string baru dari kode pemformatan yang mengikuti konvensi bahasa C. Kode %d menampilkan bilangan bulat, %s menyisipkan string, %.2f menampilkan bilangan pecahan dengan dua angka di belakang koma, dan %-8s menyisipkan string rata kiri selebar delapan karakter. Hasilnya berupa string, sehingga dapat dicetak dengan print, ditulis ke berkas, atau disimpan lebih dahulu.
-- Laporan kecil nilai ujian dengan string.format
local daftar = {
{ nama = "Ali", nilai = 78 },
{ nama = "Budi", nilai = 91 },
{ nama = "Citra", nilai = 85 },
}
local total = 0
for _, d in ipairs(daftar) do
total = total + d.nilai
print(string.format("%-8s %3d", d.nama, d.nilai))
end
print(string.format("Rata-rata kelas: %.2f", total / #daftar))Ali 78
Budi 91
Citra 85
Rata-rata kelas: 84.67Tiga baris pertama menggunakan %-8s dan %3d agar kolom nama dan nilai lurus ke bawah, sedangkan rata-rata kelas ditampilkan dengan %.2f menjadi 84.67. Kombinasi format dan perulangan seperti ini merupakan pola umum untuk laporan kecil, baik ke layar maupun ke berkas.
Kesalahan umum#
Skrip yang menggunakan pola biasanya tersandung tiga hal berikut.
- Menyalin pola regex mentah dari bahasa lain. Karakter
\tidak berfungsi di Lua, alternasi|tidak ada, dan lookahead tidak didukung. Perbaikannya adalah mengganti\dengan%, menyederhanakan pola, lalu mengujinya pada data sungguhan. - Memperlakukan hasil
gsubsebagai satu nilai. Pernyataanprint(log:gsub(pola, pengganti))mencetak string hasil dan jumlah penggantian sekaligus. Simpan keduanya ke dua variabel, atau bungkus pemanggilan dengan tanda kurung tambahan sepertiprint((log:gsub(pola, pengganti)))apabila hanya string yang diinginkan. - Mencari teks yang mengandung karakter khusus tanpa pelindung. Titik pada nama berkas seperti
data.txtdicocokkan sebagai sembarang karakter. Awali dengan%atau gunakanplain=true.
Ringkasan#
- Pustaka string berindeks dari 1 dan menyediakan
len,sub,upper,lower, sertarepuntuk manipulasi dasar. - Pola pencocokan Lua bukan regex, menggunakan
%sebagai pelindung karakter khusus, tanpa alternasi|, dan tanpa lookahead. - Kelas karakter
%d,%a, dan%sditambah kuantifikator+,-,*, dan?membentuk pola, sedangkan jangkar^dan$membatasi posisinya. find,match, dangmatchmencari serta menangkap teks lewat capture,gsubmengembalikan string hasil beserta jumlah penggantian, danformatmenyusun laporan dengan kode seperti%d,%s, dan%.2f.
Referensi#
- Lua 5.4 Reference Manual — Lua.org — Bagian 6.4 dan 6.4.1 mendokumentasikan pustaka string serta sintaks pola pencocokan secara lengkap.
- Programming in Lua — Lua.org — Bab 20 membahas pustaka string dan pola pencocokan dengan contoh yang bertahap.