0Pricing
Lua Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานข้อความ: การต่อและความยาว
  2. การค้นหาและดึงข้อความย่อย
  3. string.format สำหรับผลลัพธ์
  4. string.gsub และ string.gmatch
← กลับไปที่ Lua Academy