0Pricing
Lua Academy · Pelajaran

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"))  -- nil

string.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
end

string.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.5

Menemukan 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  6

Mengekstrak 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"))   -- bak

Memisahkan 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 four

Menghapus 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.67

Normalisasi 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)) -- efg

Pemeriksaan 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 nil
  • string.sub(s, i, j)—mengekstrak berdasarkan posisi; indeks negatif dihitung dari akhir
  • string.match(s, pat)—mengembalikan tangkapan atau kecocokan lengkap
  • Gunakan plain=true untuk 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

  1. Dasar-Dasar String: Penggabungan dan Panjang
  2. Menemukan dan Mengekstrak Substring
  3. string.format untuk Keluaran
  4. string.gsub dan string.gmatch
← Kembali ke Lua Academy