string.gsub และ string.gmatch
แทนที่และวนดูส่วนที่ตรงกับรูปแบบในข้อความ
string.gsub และ string.gmatch เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
พื้นฐาน string.gsub
string.gsub(s, pattern, repl, n) แทนที่ส่วนที่ตรงกับ pattern ใน s ด้วย repl สูงสุด n ครั้ง โดยค่าเริ่มต้นคือแทนที่ทั้งหมด ฟังก์ชันนี้คืนค่าสตริงผลลัพธ์และจำนวนครั้งที่แทนที่ โดยส่วนแทนที่อาจเป็นสตริง ตาราง หรือฟังก์ชัน
local s = "hello world hello"
local result, count = string.gsub(s, "hello", "hi")
print(result) -- hi world hi
print(count) -- 2
-- Limit replacements
local r2 = string.gsub(s, "hello", "hi", 1)
print(r2) -- hi world helloการอ้างอิงส่วนดึงข้อมูลในการแทนที่
ในสตริงแทนที่ %1, %2 และอื่น ๆ ใช้อ้างอิงส่วนดึงข้อมูลในรูปแบบ ส่วน %0 อ้างอิงส่วนที่ตรงกันทั้งหมด ใช้ความสามารถนี้เพื่อสลับลำดับหรือครอบข้อความที่ตรงกัน
-- Swap first and last name
local name = "Smith, John"
local swapped = string.gsub(name, "(%a+), (%a+)", "%2 %1")
print(swapped) -- John Smith
-- Wrap numbers in brackets
local text = "items: 3 and 7 total 10"
local tagged = string.gsub(text, "%d+", "[%0]")
print(tagged) -- items: [3] and [7] total [10]การใช้ฟังก์ชันเป็นส่วนแทนที่
เมื่อส่วนแทนที่เป็นฟังก์ชัน gsub จะเรียกฟังก์ชันนั้นกับส่วนที่ตรงกันแต่ละส่วน หรือส่วนดึงข้อมูล และใช้ค่าที่คืนมาเป็นส่วนแทนที่ หากคืนค่า nil หรือ false จะคงส่วนที่ตรงกันเดิมไว้ วิธีนี้ช่วยให้สามารถแทนที่แบบไดนามิกและคำนวณค่าได้
local env = {NAME="Lua", VERSION="5.4"}
local template = "Welcome to $NAME version $VERSION!"
local result = string.gsub(template, "%$(%w+)", env)
print(result) -- Welcome to Lua version 5.4!
-- Double each number
local s = "a1 b2 c3"
local r = string.gsub(s, "%d+", function(n)
return tostring(tonumber(n) * 2)
end)
print(r) -- a2 b4 c6การใช้ตารางเป็นส่วนแทนที่
เมื่อส่วนแทนที่เป็นตาราง gsub จะค้นหาส่วนที่ตรงกันแต่ละส่วน หรือส่วนดึงข้อมูลแรก ในตาราง แล้วใช้ค่าผลลัพธ์ หากการค้นคืนค่า nil หรือ false จะคงส่วนที่ตรงกันเดิมไว้ วิธีนี้เหมาะอย่างยิ่งสำหรับพจนานุกรมการแทนที่
local abbreviations = {
str = "string",
num = "number",
tbl = "table",
fn = "function",
}
local text = "A str can hold a num or a tbl"
local expanded = string.gsub(text, "%a+", abbreviations)
print(expanded)
-- A string can hold a number or a tableพื้นฐาน string.gmatch
string.gmatch(s, pattern) คืนค่าตัววนซ้ำสำหรับส่วนที่ตรงกับ pattern ทั้งหมดใน s การเรียกตัววนซ้ำแต่ละครั้งจะคืนค่าส่วนที่ตรงกันถัดไป หรือส่วนดึงข้อมูลหากรูปแบบมีส่วนดังกล่าว นี่เป็นวิธีมาตรฐานของ Lua ในการวนซ้ำผ่านส่วนที่ตรงกัน
local s = "one=1 two=2 three=3"
-- Iterate all words
for word in string.gmatch(s, "%a+") do
io.write(word .. " ")
end
print() -- one two three
-- Iterate key=value pairs
for k, v in string.gmatch(s, "(%a+)=(%d+)") do
print(k, v)
endการแยกโทเค็นด้วย gmatch
ใช้ string.gmatch เพื่อแยกโทเค็นจากข้อมูลเข้า เช่น แยกด้วยช่องว่าง แยกแถว CSV หรือดึงข้อมูลที่มีโครงสร้าง รูปแบบจะกำหนดสิ่งที่จะดึงข้อมูล ส่วนอื่น ๆ ทั้งหมดจะถือเป็นตัวคั่น
-- Split by whitespace
local function tokenize(s)
local tokens = {}
for token in string.gmatch(s, "%S+") do
tokens[#tokens+1] = token
end
return tokens
end
local toks = tokenize(" hello world lua ")
for i, t in ipairs(toks) do
print(i, t)
end
-- 1 hello 2 world 3 luaการแยกวิเคราะห์พารามิเตอร์ URL
แยกวิเคราะห์สตริงคำค้นด้วยการวนซ้ำผ่านคู่คีย์และค่า รูปแบบ ([^&=]+)=([^&]+) จะดึงคีย์และค่าแต่ละคู่ที่คั่นด้วย = และอยู่ระหว่างตัวคั่น &
local url_params = "name=Alice&age=30&city=Istanbul"
local params = {}
for key, value in string.gmatch(url_params, "([^&=]+)=([^&]*)") do
params[key] = value
end
print(params.name) -- Alice
print(params.age) -- 30
print(params.city) -- Istanbulการลบแท็ก HTML
งานประมวลผลข้อความที่พบได้บ่อยคือการลบแท็ก HTML ออกจากสตริง ใช้ string.gsub พร้อมรูปแบบที่ตรงกับแท็กเปิดและแท็กปิด แล้วแทนที่ด้วยสตริงว่าง
local html = "<h1>Hello</h1> <p>World <b>bold</b></p>"
local plain = string.gsub(html, "<[^>]+>", "")
print(plain) -- Hello World bold
-- Replace <br> with newline
local html2 = "line1<br>line2<br/>line3"
local fixed = string.gsub(html2, "<br/?>", "\n")
print(fixed)การหลีกอักขระพิเศษของรูปแบบ
อักขระพิเศษของรูปแบบ Lua ได้แก่ . + * ? [ ] ^ $ % ( ) หากต้องการจับคู่ตามตัวอักษร ให้ใช้ % เป็นอักขระหลีก เมื่อใช้สตริงตามตัวอักษรที่มีอักขระเหล่านี้ ให้ส่ง true เป็นอาร์กิวเมนต์ตัวที่สี่ของ string.find เพื่อปิดการจับคู่รูปแบบ
-- Escape a string for use in a pattern
local function escapePattern(s)
return (string.gsub(s, "[%(%)%.%%%+%-%*%?%[%^%$]", "%%%1"))
end
local query = "1+1=2"
local pattern = escapePattern(query)
print(string.find("result: 1+1=2", pattern, 1)) -- 9 13การนับจำนวนครั้งที่พบ
ใช้ค่าที่คืนมาตัวที่สองของ string.gsub ซึ่งคือจำนวนครั้งที่แทนที่ เพื่อนับจำนวนครั้งที่รูปแบบปรากฏในสตริง แม้จะไม่ได้ทำการแทนที่ใด ๆ
local text = "banana"
local _, count = string.gsub(text, "a", "")
print("'a' appears " .. count .. " times") -- 3
-- Count words
local sentence = "the quick brown fox"
local _, wordCount = string.gsub(sentence, "%S+", "")
print("Words:", wordCount) -- 4ตรวจสอบอย่างรวดเร็ว
string.gsub("hello", "l", "L") คืนค่าอะไร
สรุป: gsub และ gmatch
สรุป:
gsub(s, pat, repl, n)— แทนที่ โดย repl อาจเป็นสตริง ตาราง หรือฟังก์ชัน%1...%nในสตริงแทนที่จะใช้อ้างอิงส่วนดึงข้อมูลgmatch(s, pat)— วนซ้ำผ่านส่วนที่ตรงกันทั้งหมด- ใช้
%เพื่อหลีกอักขระพิเศษของรูปแบบ:%.%+เป็นต้น - นับจำนวนครั้งที่พบด้วยค่าที่คืนมาตัวที่สองของ gsub
คำถามที่พบบ่อย
บทเรียน “string.gsub และ string.gmatch” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “string.gsub และ string.gmatch” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “string.gsub และ string.gmatch”
แทนที่และวนดูส่วนที่ตรงกับรูปแบบในข้อความ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “string.gsub และ string.gmatch” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานข้อความ: การต่อและความยาว
- การค้นหาและดึงข้อความย่อย
- string.format สำหรับผลลัพธ์
- string.gsub และ string.gmatch