Menemukan dan Mengekstrak Substring
Terapkan string.find dan string.sub untuk menemukan dan mengekstrak teks.
Menemukan dan Mengekstrak Substring adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Dasar-Dasar string.find
string.find(s, pattern, init, plain) mencari pola dalam s, dimulai dari init (nilai bawaan 1). Fungsi ini mengembalikan posisi awal dan akhir kecocokan, atau nil jika tidak ditemukan. Dengan plain=true, pola diperlakukan sebagai string literal (tanpa karakter khusus).
local s = "hello world"
local i, j = string.find(s, "world")
print(i, j) -- 7 11
-- Plain search (literal string)
local i2, j2 = string.find("a+b=5", "+", 1, true)
print(i2, j2) -- 2 2
-- Not found
print(string.find(s, "xyz")) -- nilstring.sub untuk Ekstraksi
string.sub(s, i, j) mengekstrak substring dari posisi i hingga j (inklusif). Indeks negatif dihitung dari akhir: -1 adalah karakter terakhir. Jika j tidak disertakan, nilai bawaannya adalah akhir string.
local s = "hello world"
print(string.sub(s, 1, 5)) -- hello
print(string.sub(s, 7)) -- world
print(string.sub(s, -5)) -- world
print(string.sub(s, 1, -7)) -- hello
print(s:sub(7, 11)) -- world (method syntax)Menggabungkan find dan sub
Gabungkan string.find dan string.sub untuk menemukan dan mengekstrak substring. Pertama, temukan pemisahnya, lalu ekstrak bagian-bagian di sekitarnya. Ini adalah pendekatan dasar untuk memisahkan string.
local s = "key=value"
local i = string.find(s, "=")
if i then
local key = string.sub(s, 1, i - 1)
local val = string.sub(s, i + 1)
print(key, val) -- key value
endstring.match untuk Penangkapan Pola
string.match(s, pattern, init) mengembalikan substring yang ditangkap dan cocok dengan pola. Jika pola tidak memiliki tangkapan, fungsi ini mengembalikan seluruh kecocokan. Jika tidak ada yang cocok, fungsi ini mengembalikan nil. Tangkapan ditentukan dengan tanda kurung dalam pola.
local date = "2024-03-15"
local y, m, d = string.match(date, "(%d+)-(%d+)-(%d+)")
print(y, m, d) -- 2024 03 15
-- No capture: returns the whole match
local num = string.match("price: 42.5 USD", "%d+%.%d+")
print(num) -- 42.5Menemukan Kemunculan Terakhir
Untuk menemukan kemunculan terakhir suatu substring, lakukan pencarian dalam perulangan dengan memajukan posisi awal, atau lakukan pencarian dari akhir. Pendekatan standarnya adalah terus memanggil string.find dengan posisi tepat setelah kecocokan sebelumnya hingga fungsi tersebut mengembalikan nil.
local function findLast(s, sub)
local last_i, last_j
local i, j = string.find(s, sub, 1, true)
while i do
last_i, last_j = i, j
i, j = string.find(s, sub, j + 1, true)
end
return last_i, last_j
end
local i, j = findLast("a/b/c/d", "/")
print(i, j) -- 6 6Mengekstrak Ekstensi File
Salah satu penggunaan praktis string.match adalah mengekstrak ekstensi dari nama file. Pola "([^%.]+)$" menangkap rangkaian terakhir yang tidak mengandung titik di akhir string, sedangkan "%.([^%.]+)$" hanya menangkap bagian setelah titik terakhir.
local function getExt(filename)
return string.match(filename, "%.([^%.]+)$")
end
print(getExt("photo.jpg")) -- jpg
print(getExt("archive.tar.gz")) -- gz
print(getExt("README")) -- nil
print(getExt("config.lua.bak")) -- bakMemisahkan String
Lua tidak memiliki fitur bawaan untuk memisahkan string, tetapi Anda dapat mengimplementasikannya dengan string.gmatch. Lakukan iterasi pada semua rangkaian yang bukan pemisah, atau gunakan pola yang menangkap bagian di antara pemisah.
local function split(s, sep)
local result = {}
local pattern = "([^" .. sep .. "]+)"
for part in string.gmatch(s, pattern) do
result[#result+1] = part
end
return result
end
local parts = split("one,two,three,four", ",")
for i, p in ipairs(parts) do
print(i, p)
end
-- 1 one 2 two 3 three 4 fourMenghapus Spasi Putih
Hapus spasi putih di awal dan akhir dengan mencocokkan lalu membuangnya. Pola "^%s*(.-)%s*$" menggunakan kuantifier malas .- untuk menangkap isi seminimal mungkin di antara spasi awal dan akhir yang bersifat opsional.
local function trim(s)
return string.match(s, "^%s*(.-)%s*$")
end
print("|" .. trim(" hello ") .. "|") -- |hello|
print("|" .. trim(" \t\n") .. "|") -- ||
print("|" .. trim("no spaces") .. "|") -- |no spaces|Mengekstrak Angka dari Teks
Gunakan string.gmatch dengan pola angka untuk mengekstrak semua angka dari string. Pola %-?%d+%.?%d* mencocokkan tanda negatif opsional, digit, titik desimal opsional, dan digit tambahan.
local text = "Revenue: $1,234.56 Expenses: $567.89 Net: $666.67"
local numbers = {}
for n in string.gmatch(text, "%d+%.?%d*") do
numbers[#numbers+1] = tonumber(n)
end
for _, v in ipairs(numbers) do
io.write(v .. " ")
end
print() -- 1 234.0 56.0 567.89 666.67Normalisasi Posisi String
Indeks negatif Lua memungkinkan Anda bekerja dari akhir string. string.sub(s, -n) mengambil n karakter terakhir. Gabungkan dengan #s untuk menghitung posisi. Memahami hubungan antara indeks positif dan negatif mencegah kesalahan selisih satu.
local s = "abcdefgh"
-- Last 3 characters
print(s:sub(-3)) -- fgh
-- All but last 2
print(s:sub(1, -3)) -- abcdef
-- Character at position from end
print(s:sub(-1, -1)) -- h
print(s:sub(-4, -2)) -- efgPemeriksaan Singkat
Apa yang dikembalikan oleh string.sub("hello", 2, -2)?
Ringkasan: Menemukan dan Mengekstrak
Ringkasan:
string.find(s, pat, init, plain)—mengembalikan posisi awal, posisi akhir, atau nilstring.sub(s, i, j)—mengekstrak berdasarkan posisi; indeks negatif dihitung dari akhirstring.match(s, pat)—mengembalikan tangkapan atau kecocokan lengkap- Gunakan
plain=trueuntuk pencarian literal (tanpa karakter khusus) - Implementasikan pemisahan dengan
string.gmatch - Pemangkasan: pola
"^%s*(.-)%s*$"
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menemukan dan Mengekstrak Substring” gratis?
Ya — teks lengkap “Menemukan dan Mengekstrak Substring” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menemukan dan Mengekstrak Substring”?
Terapkan string.find dan string.sub untuk menemukan dan mengekstrak teks. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Menemukan dan Mengekstrak Substring” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar String: Penggabungan dan Panjang
- Menemukan dan Mengekstrak Substring
- string.format untuk Keluaran
- string.gsub dan string.gmatch