การค้นหาและดึงข้อความย่อย
ใช้ string.find และ string.sub เพื่อค้นหาและดึงข้อความ
การค้นหาและดึงข้อความย่อย เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
พื้นฐาน string.find
string.find(s, pattern, init, plain) ใช้ค้นหารูปแบบใน s โดยเริ่มจาก init ซึ่งมีค่าเริ่มต้นเป็น 1 ฟังก์ชันนี้คืนค่าตำแหน่งเริ่มต้นและสิ้นสุดของส่วนที่ตรงกัน หรือคืนค่าเป็น nil หากไม่พบ เมื่อกำหนด plain=true จะถือว่ารูปแบบเป็นสตริงตามตัวอักษร โดยไม่ใช้ตัวอักขระพิเศษของรูปแบบ
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 เพื่อดึงข้อมูล
string.sub(s, i, j) ดึงสตริงย่อยตั้งแต่ตำแหน่ง i ถึง j โดยรวมตำแหน่งปลายทางด้วย ดัชนีติดลบจะนับจากท้ายสตริง โดย -1 คืออักขระตัวสุดท้าย หากไม่ระบุ j ระบบจะใช้ตำแหน่งท้ายสตริงเป็นค่าเริ่มต้น
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)การใช้ find และ sub ร่วมกัน
ใช้ string.find และ string.sub ร่วมกันเพื่อค้นหาและดึงสตริงย่อย ขั้นแรกให้ค้นหาตัวคั่น จากนั้นดึงส่วนต่าง ๆ ที่อยู่รอบตัวคั่น วิธีนี้เป็นแนวทางพื้นฐานในการแยกสตริง
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 เพื่อดึงส่วนที่ตรงกับรูปแบบ
string.match(s, pattern, init) จะคืนค่าสตริงย่อยที่ดึงได้จากส่วนที่ตรงกับรูปแบบ หากรูปแบบไม่มีส่วนดึงข้อมูล ฟังก์ชันจะคืนค่าส่วนที่ตรงกันทั้งหมด หากไม่พบสิ่งที่ตรงกัน จะคืนค่าเป็น nil ส่วนดึงข้อมูลกำหนดด้วยวงเล็บในรูปแบบ
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การค้นหาตำแหน่งที่พบครั้งสุดท้าย
หากต้องการค้นหาตำแหน่งสุดท้ายที่พบสตริงย่อย ให้ค้นหาด้วยลูปที่เลื่อนตำแหน่งเริ่มต้นไปข้างหน้า หรือค้นหาจากท้ายสตริง แนวทางมาตรฐานคือเรียกใช้ string.find ซ้ำ โดยใช้ตำแหน่งถัดจากส่วนที่ตรงกันครั้งก่อนเป็นจุดเริ่มต้น จนกว่าจะคืนค่าเป็น 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การดึงนามสกุลไฟล์
การใช้งาน string.match ที่พบได้จริงคือการดึงนามสกุลจากชื่อไฟล์ รูปแบบ "([^%.]+)$" จะดึงลำดับอักขระสุดท้ายที่ไม่มีจุดจากท้ายสตริง หรือใช้ "%.([^%.]+)$" เพื่อดึงเฉพาะส่วนที่อยู่หลังจุดสุดท้าย
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การแยกสตริง
Lua ไม่มีฟังก์ชันแยกสตริงในตัว แต่คุณสามารถสร้างฟังก์ชันดังกล่าวด้วย string.gmatch ได้ ให้วนซ้ำผ่านลำดับอักขระทั้งหมดที่ไม่ใช่ตัวคั่น หรือใช้รูปแบบที่ดึงข้อมูลระหว่างตัวคั่น
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การตัดช่องว่าง
ลบช่องว่างด้านหน้าและด้านท้ายด้วยการจับคู่และทิ้งช่องว่างเหล่านั้น รูปแบบ "^%s*(.-)%s*$" ใช้ตัวระบุปริมาณแบบไม่ตะกละ .- เพื่อดึงเนื้อหาขั้นต่ำระหว่างช่องว่างด้านหน้าและด้านท้ายที่อาจมีอยู่
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|การดึงตัวเลขจากข้อความ
ใช้ string.gmatch ร่วมกับรูปแบบตัวเลขเพื่อดึงตัวเลขทั้งหมดจากสตริง รูปแบบ %-?%d+%.?%d* จะจับเครื่องหมายลบที่อาจมีอยู่ ตัวเลข จุดทศนิยมที่อาจมีอยู่ และตัวเลขเพิ่มเติม
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การปรับมาตรฐานตำแหน่งในสตริง
ดัชนีติดลบของ Lua ช่วยให้คุณทำงานจากท้ายสตริงได้ string.sub(s, -n) จะดึงอักขระ n ตัวสุดท้าย ใช้ร่วมกับ #s เพื่อคำนวณตำแหน่ง การเข้าใจความสัมพันธ์ระหว่างดัชนีบวกและดัชนีลบจะช่วยป้องกันข้อผิดพลาดแบบเลื่อนตำแหน่งไปหนึ่งตำแหน่ง
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ตรวจสอบอย่างรวดเร็ว
string.sub("hello", 2, -2) คืนค่าอะไร
สรุป: การค้นหาและดึงข้อมูล
สรุป:
string.find(s, pat, init, plain)— คืนค่าตำแหน่งเริ่มต้นและสิ้นสุด หรือ nilstring.sub(s, i, j)— ดึงข้อมูลตามตำแหน่ง ดัชนีติดลบจะนับจากท้ายสตริงstring.match(s, pat)— คืนค่าส่วนดึงข้อมูลหรือส่วนที่ตรงกันทั้งหมด- ใช้
plain=trueสำหรับการค้นหาสตริงตามตัวอักษร โดยไม่ใช้ตัวอักขระพิเศษ - สร้างการแยกสตริงด้วย
string.gmatch - ตัดช่องว่างด้วยรูปแบบ
"^%s*(.-)%s*$"
คำถามที่พบบ่อย
บทเรียน “การค้นหาและดึงข้อความย่อย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การค้นหาและดึงข้อความย่อย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การค้นหาและดึงข้อความย่อย”
ใช้ string.find และ string.sub เพื่อค้นหาและดึงข้อความ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การค้นหาและดึงข้อความย่อย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานข้อความ: การต่อและความยาว
- การค้นหาและดึงข้อความย่อย
- string.format สำหรับผลลัพธ์
- string.gsub และ string.gmatch