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

การค้นหาและดึงข้อความย่อย

ใช้ 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) — คืนค่าตำแหน่งเริ่มต้นและสิ้นสุด หรือ nil
  • string.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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