ประเภทข้อมูล สตริง คือชุดของตัวอักษร เช่น ตัวอักษร ตัวเลข และสัญลักษณ์ มันเป็นประเภทข้อมูลสำหรับเก็บข้อมูลที่เป็นข้อความส่วนใหญ่
ประกาศสตริง
ในการประกาศตัวแปรสตริง ให้ใส่เครื่องหมายคำพูดรอบตัวอักษร มักจะใช้เครื่องหมายคำพูดคู่ ("), แต่เครื่องหมายคำพูดเดี่ยว (') ก็ใช้งานได้เช่นกัน หากคุณต้องการใส่เครื่องหมายคำพูดเดี่ยวหรือคู่ในสตริงของคุณ ให้ใช้สตริงในประเภทของเครื่องหมายคำพูดที่แตกต่างกัน หรือใช้ เครื่องหมายคำพูดที่ถูกเอาออก.
local string1 = "Hello world!"
print(string1) --> Hello world!
local string2 = 'Hello "world"!'
print(string2) --> Hello "world"!หากต้องการรวมเครื่องหมายคำพูดเดี่ยวและคู่ในสตริงเดียวกัน หรือสร้างสตริงหลายบรรทัด ให้ประกาศใช้งานโดยใช้วงเล็บคู่:
local string1 = [[Hello
world!
Hello "world"!
Hello 'world'!]]
print(string1)
--> Hello
--> world!
--> Hello "world"!
--> Hello 'world'!หากจำเป็นสามารถซ้อนวงเล็บหลายตัวภายในสตริงโดยใช้จำนวนสัญลักษณ์เท่ากันในทั้งวงเล็บเริ่มต้นและวงเล็บสุดท้าย:
local string1 = [=[Hello
[[world!]]
]=]
print(string1)
--> Hello
--> [[world!]]รวมสตริง
ในการรวมสตริง ให้ การต่อ สตริงด้วยจุดสองจุด (..) การต่อสตริงจะไม่แทรกเว้นว่างระหว่างสตริง ดังนั้นคุณต้องใส่ช่องว่างที่ส่วนท้าย/ส่วนเริ่มต้นของสตริงที่มีมาก่อน/หลักหรือต้องรวมช่องว่างระหว่างสองสตริง
local hello = "Hello"
local helloWithSpace = "Hello "
local world = "world!"
local string1 = hello .. world
local string2 = helloWithSpace .. world
local string3 = hello .. " " .. world
print(string1) --> Helloworld!
print(string2) --> Hello world!
print(string3) --> Hello world!โปรดทราบว่า คำสั่ง print() รับพารามิเตอร์หลายตัวและรวมเข้าด้วยกัน ด้วย ช่องว่าง ดังนั้นคุณสามารถใช้ , แทน .. เพื่อให้ได้ช่องว่างในผลลัพธ์ print()
local hello = "Hello"
local world = "world"
local exclamationMark = "!"
print(hello .. world .. exclamationMark) --> Helloworld!
print(hello, world .. exclamationMark) --> Hello world!
print(hello, world, exclamationMark) --> Hello world !แปลงสตริง
ในการแปลงสตริงเป็นตัวเลข ใช้ฟังก์ชัน tonumber() หากสตริงไม่มีการแสดงผลจำนวน ฟังก์ชัน tonumber() จะส่งกลับค่า nil.
local numericString = "123"
print(tonumber(numericString)) --> 123
local alphanumericString = "Hello123"
print(tonumber(alphanumericString)) --> nilการเอาสตริง
ในการเอาคำพูดคู่หรือเดี่ยวในการประกาศสตริง และฝังเกือบทุกตัวอักษร ให้ใส่เครื่องหมายกลับ (\) ก่อนตัวอักษร เช่น:
- เพื่อฝังเครื่องหมายคำพูดเดี่ยวในสตริงเครื่องหมายคำพูดเดี่ยว ให้ใช้ \'.
- เพื่อฝังเครื่องหมายคำพูดคู่ในสตริงเครื่องหมายคำพูดคู่ ให้ใช้ \".
local string1 = 'Hello \'world\'!'
print(string1) --> Hello 'world'!
local string2 = "Hello \"world\"!"
print(string2) --> Hello "world"!ตัวอักษรบางตัวที่ตามหลังเครื่องหมายย้อนจะผลิตตัวอักษรพิเศษแทนที่จะเป็นตัวอักษรที่ถูกเอาออก:
- เพื่อฝังบรรทัดใหม่ ใช้ \n.
- เพื่อฝังแท็บแนวนอน ใช้ \t.
local string1 = "Hello\nworld!"
print(string1)
--> Hello
--> world!
local string2 = "Hello\tworld!"
print(string2) --> Hello world!การประกอบสตริง
Luau สนับสนุน การประกอบสตริง ฟีเจอร์ที่ช่วยให้คุณสามารถแทรกนิพจน์ลงไปในสตริง ใช้แบ็คติค (`) ในการประกาศสตริงที่มีการประกอบ จากนั้นเพิ่มนิพจน์ภายในวงเล็บปีกกา:
local world = "world"
local string1 = `Hello {world}!`
print(string1) --> Hello world!แม้ว่าตัวแปรจะเป็นการใช้งานที่พบบ่อย แต่คุณสามารถใช้นิพจน์ใดๆ รวมทั้งคณิตศาสตร์ได้:
local world = "world"
local number = 1
local letters = {"w", "o", "r", "l", "d"}
local string1 = `Hello {world}, {number} time!`
local string2 = `Hello {world}, {number + 1} times!`
local string3 = `Hello {table.concat(letters)} a third time!`
print(string1) --> Hello world, 1 time!
print(string2) --> Hello world, 2 times!
print(string3) --> Hello world a third time!กฎการเอาคืนมาตรฐานใช้ได้สำหรับแบ็คติค วงเล็บปีกกา และเครื่องหมายกลับ:
local string1 = `Hello \`\{world\}\`!`
print(string1) --> Hello `{world}`!การแปลงทางคณิตศาสตร์
หากคุณทำการดำเนินการทางคณิตศาสตร์กับสตริง Luau จะทำการแปลงสตริงเป็นตัวเลขโดยอัตโนมัติ หากสตริงไม่มีการแสดงผลจำนวน มันจะทำให้เกิดข้อผิดพลาด
print("55" + 10) --> 65
print("55" - 10) --> 45
print("55" * 10) --> 550
print("55" / 10) --> 5.5
print("55" % 10) --> 5
print("Hello" + 10) --> print("Hello" + 10):1: attempt to perform arithmetic (add) on string and numberการเปรียบเทียบ
สามารถเปรียบเทียบสตริงได้ด้วยการใช้ตัวดำเนินการ <, <=, >, และ >= ซึ่งจะเปรียบเทียบตามลำดับพจนานุกรมตามรหัส ASCII ของตัวอักษรแต่ละตัวในสตริง สิ่งนี้จะทำให้ตัวเลขในสตริงไม่ถูกเปรียบเทียบอย่างถูกต้อง เช่น "100" จะน้อยกว่า "20" เนื่องจากไบต์ "0" และ "1" มีรหัส ASCII ที่ต่ำกว่าไบต์ "2".
print("Apple" < "apple") --> true
print("Banana" < "apple") --> true (B อยู่ก่อนไป a ใน ASCII)
print("number100" < "number20") --> trueอ้างอิงรูปแบบสตริง
รูปแบบ สตริง คือการรวมกันของตัวอักษรที่คุณสามารถใช้กับ string.match(), string.gmatch(), และฟังก์ชันอื่นๆ เพื่อ ค้นหาชิ้นส่วน หรือซับสตริง ของสตริงที่ยาวกว่า
การจับคู่โดยตรง
คุณสามารถใช้การจับคู่โดยตรงในฟังก์ชัน Luau เช่น string.match() ยกเว้น อักขระพิเศษ ตัวอย่างเช่น คำสั่งเหล่านี้ จะค้นหาคำว่า Roblox ภายในสตริง:
local match1 = string.match("Welcome to Roblox!", "Roblox")
local match2 = string.match("Welcome to my awesome game!", "Roblox")
print(match1) --> Roblox
print(match2) --> nilคลาสตัวอักษร
คลาสตัวอักษรนั้นจำเป็นสำหรับการค้นหาสตริงที่ซับซ้อนขึ้น คุณสามารถใช้ พวกเขาเพื่อค้นหาสิ่งที่ไม่จำเป็นต้องเฉพาะเจาะจงในตัวอักษร แต่ อยู่ในหมวดหมู่ที่รู้จัก (คลาส) รวมถึง ตัวอักษร, ตัวเลข, ช่องว่าง, เครื่องหมายวรรคตอน, และอื่นๆ
ตารางต่อไปนี้แสดงคลาสตัวอักษรอย่างเป็นทางการสำหรับรูปแบบสตริงของ Luau:
| คลาส | แสดงถึง | ตัวอย่างการจับคู่ |
|---|---|---|
| . | ตัวอักษรใดๆ | 32kasGJ1%fTlk?@94 |
| %a | ตัวอักษรตัวใหญ่หรือเล็ก | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
| %l | ตัวอักษรตัวเล็ก | abcdefghijklmnopqrstuvwxyz |
| %u | ตัวอักษรตัวใหญ่ | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
| %d | ตัวเลขใดๆ | 0123456789 |
| %p | เครื่องหมายวรรคตอนใดๆ | !@#;,. |
| %w | ตัวอักษรที่เป็นอัลฟาเบต (ตัวอักษร หรือ ตัวเลข) | aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789 |
| %s | ช่องว่างหรืออักขระว่าง | , \n, และ \r |
| %c | อักขระควบคุมพิเศษ control character | |
| %x | อักขระฐานสิบหก | 0123456789ABCDEF |
| %z | อักขระ NULL (\0) |
สำหรับคลาสตัวอักษรที่มีตัวอักษรเดียวเช่น %a และ %s ตัวอักษรตัวใหญ่ที่ตรงกันจะแสดงถึง "ตรงกันข้าม" ของคลาส เช่น %p แสดงถึงเครื่องหมายวรรคตอน ในขณะที่ %P แสดงถึงตัวอักษรทั้งหมดโดยไม่มีเครื่องหมายวรรคตอน
อักขระพิเศษ
มีอักขระ "พิเศษ" 12 ตัวที่สงวนไว้เพื่อวัตถุประสงค์พิเศษในรูปแบบ:
| $ | % | ^ | * | ( | ) |
| . | [ | ] | + | - | ? |
คุณสามารถเอาออกและค้นหาอักขระพิเศษโดยใช้สัญลักษณ์ % ตัวอย่างเช่น หากคุณต้องการค้นหา roblox.com สามารถเอาเครื่องหมาย . (จุด) โดยการใส่ % ข้างหน้า เช่น %.
-- "roblox.com" จะจับคู่กับ "roblox#com" เพราะจุดถูกตีความว่า "ตัวอักษรใดก็ได้"
local match1 = string.match("What is roblox#com?", "roblox.com")
print(match1) --> roblox#com
-- เอาจุดออกด้วย % เพื่อให้ตีความว่าเป็นตัวอักษรจุดตามตัวอักษร
local match2 = string.match("I love roblox.com!", "roblox%.com")
print(match2) --> roblox.comแอนเคอร์
คุณสามารถค้นหารูปแบบที่ต้นหรือตอนท้ายของสตริงได้โดยการใช้ สัญลักษณ์ ^ และ $.
local start1 = string.match("first second third", "^first") -- ตรงกันเพราะ "first" อยู่ที่จุดเริ่มต้น
print(start1) --> first
local start2 = string.match("third second first", "^first") -- ไม่ตรงกันเพราะ "first" ไม่อยู่ที่จุดเริ่มต้น
print(start2) --> nil
local end1 = string.match("first second third", "third$") -- ตรงกันเพราะ "third" อยู่ที่ตอนท้าย
print(end1) --> third
local end2 = string.match("third second first", "third$") -- ไม่ตรงกันเพราะ "third" ไม่อยู่ที่ตอนท้าย
print(end2) --> nilคุณยังสามารถใช้ทั้ง ^ และ $ ร่วมกันเพื่อให้แน่ใจว่ารูปแบบตรงกันเฉพาะกับสตริงทั้งหมดและไม่เพียงแค่บางส่วน
-- การใช้ทั้ง ^ และ $ เพื่อตรงกันข้ามทั้งสตริง
local match1 = string.match("Roblox", "^Roblox$") -- ตรงกันเพราะ "Roblox" คือสตริงทั้งหมด (ความเท่าเทียมกัน)
print(match1) --> Roblox
local match2 = string.match("I play Roblox", "^Roblox$") -- ไม่ตรงกันเพราะ "Roblox" ไม่อยู่ที่เริ่มต้นและจบ
print(match2) --> nil
local match3 = string.match("I play Roblox", "Roblox") -- ตรงกันเพราะ "Roblox" อยู่ภายใน "I play Roblox"
print(match3) --> Robloxตัวแก้ไขชนิด
โดยตัวมันเอง คลาสตัวอักษรจะจับคู่เพียง หนึ่ง ตัวอักษรในสตริง สำหรับ เช่น รูปแบบต่อไปนี้ ("%d") เริ่มอ่านสตริงจากซ้ายไปขวา ค้นหาหมายเลข แรก (2) และหยุด
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")
print(match) --> 2คุณสามารถใช้ ตัวแก้ไข กับคลาสตัวอักษรที่ใดก็ได้เพื่อควบคุมผลลัพธ์:
| ตัวจำนวน | ความหมาย |
|---|---|
| + | ตรงกัน 1 หรือมากกว่าของคลาสตัวอักษรก่อนหน้า |
| - | ตรงกันน้อยที่สุดของคลาสตัวอักษรก่อนหน้า |
| * | ตรงกัน 0 หรือมากกว่าของคลาสตัวอักษรก่อนหน้า |
| ? | ตรงกัน 1 หรือไม่มากกว่าของคลาสตัวอักษรก่อนหน้า |
| %n | สำหรับ n ระหว่าง 1 และ 9, ตรงกับซับสตริงที่เท่ากับ n ที่ถูกจับคู่ |
| %bxy | การจับคู่ที่สมดุลที่ตรงกับ x, y, และสิ่งที่อยู่ระหว่าง (เช่น %b() ตรงกับคู่ของวงเล็บและสิ่งที่อยู่ระหว่าง) |
การเพิ่มตัวแก้ไขไปยังรูปแบบเดียวกัน ("%d+" แทน "%d"), จะได้ 25 แทนที่จะเป็น 2:
local match1 = string.match("The Cloud Kingdom has 25 power gems", "%d")
print(match1) --> 2
local match2 = string.match("The Cloud Kingdom has 25 power gems", "%d+")
print(match2) --> 25ชุดตัวอักษร
ชุด ควรใช้เมื่อคลาสตัวอักษรเดียวไม่สามารถทำทั้งหมดได้ สมมุติว่าคุณต้องการจับคู่ทั้งตัวอักษรตัวเล็ก (%l) และ เครื่องหมายวรรคตอน (%p) โดยใช้รูปแบบเดียว
ชุดจะถูกกำหนดโดยมีการใช้วงเล็บ [] รอบๆ ตัวอักษร ในตัวอย่างต่อไปนี้ สังเกตความแตกต่างระหว่างการใช้ชุด ("[%l%p]+") และ ไม่ ใช้ชุด ("%l%p+").
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- ชุด
print(match1) --> ello!!!
local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- ไม่ชุด
print(match2) --> o!!!คำสั่งแรก (ชุด) บอกให้ Luau ค้นหาตัวอักษรตัวเล็กและเครื่องหมายวรรคตอน โดยใช้ + เพิ่มหลังจากชุดทั้งหมด ทำให้มันพบ ทั้งหมด ของอักขระนั้น (ello!!!), หยุดเมื่อมันถึงช่องว่าง.
ในคำสั่งที่สอง (ไม่ชุด), ตัวเลข + ใช้เพียงเพื่อ %p คลาสก่อนหน้า ดังนั้น Luau จึงเพียงแค่ดึงตัวอักษรตัวเล็กแรก (o) ก่อนจะเจอกับเครื่องหมายวรรคตอน (!!!).
เหมือนกับคลาสตัวอักษร ชุดสามารถเป็น "ตรงกันข้าม" ของตัวเอง ได้ โดยการเพิ่มอักขระ ^ ที่ด้านหน้าอย่างใกล้ชิดกับ [ แรก สำหรับตัวอย่าง "[%p%s]+" แสดงถึงทั้งเครื่องหมายวรรคตอนและช่องว่าง ในขณะที่ "[^%p%s]+" แสดงถึงตัวอักษรทั้งหมด ยกเว้น เครื่องหมายวรรคตอนและช่องว่าง.
ชุดยังสนับสนุน ช่วง ที่ช่วยให้คุณค้นหาช่วงทั้งหมด ระหว่างตัวอักษรเริ่มต้นและตัวอักษรสุดท้าย ฟีเจอร์นี้เป็นฟีเจอร์ขั้นสูงซึ่ง ได้รับการอธิบายอย่างละเอียดใน Lua 5.1 Manual.
การจับคู่สตริง
การจับคู่สตริง จับคู่ เป็นซับแพทเทิร์นภายในรูปแบบ เหล่านี้ถูกครอบคลุม ในวงเล็บ () และใช้เพื่อให้ได้ (จับคู่) ซับสตริงที่ตรงกันและบันทึก ไปยังตัวแปร ตัวอย่างเช่น รูปแบบต่อไปนี้มีการจับคู่สองครั้ง, (%a+) และ (%d+) ซึ่งส่งคืนซับสตริงสองตัวเมื่อมีการจับคู่สำเร็จ.
local pattern = "(%a+)%s?=%s?(%d+)"
local key1, val1 = string.match("TwentyOne = 21", pattern)
print(key1, val1) --> TwentyOne 21
local key2, val2 = string.match("TwoThousand= 2000", pattern)
print(key2, val2) --> TwoThousand 2000
local key3, val3 = string.match("OneMillion=1000000", pattern)
print(key3, val3) --> OneMillion 1000000ตัวแก้ไข ? ที่ตามหลัง %s ทั้งสองคลาสเป็นการเพิ่มความปลอดภัย เพราะมันทำให้ช่องว่างทั้งสองด้านของเครื่องหมาย = เป็นออปชัน จึงทำให้ การจับคู่สำเร็จหากช่องว่าง (หรือทั้งสอง) ขาดหายไปรอบเครื่องหมายเท่ากัน
ในฟังก์ชัน string.gsub() คุณสามารถรวมกลุ่มการจับคู่ในการ เปลี่ยนแปลงซึ่งใช้ %1, %2, %3, ฯลฯ ไปถึง %9 แม้ว่าจริง ๆ แล้ว Luau สนับสนุนถึง 32 กลุ่มการจับคู่ก่อนที่จะเกิดข้อผิดพลาด แต่คุณสามารถอ้างอิง ถึงแค่เก้ากลุ่มแรกด้วยไวยากรณ์นี้:
local str = "love2play Roblox"
local pattern = "(%w+)(%d+)(%w+)%s+(%w+)"
local replacement = "I %1 %2 %3 %4!"
local result = string.gsub(str, pattern, replacement)
print(result) --> I love 2 play Roblox!คุณยังสามารถซ้อนการจับสตริงได้:
local places = "The Cloud Kingdom is heavenly, The Forest Kingdom is peaceful"
local pattern = "(The%s(%a+%sKingdom)[%w%s]+)"
for description, kingdom in string.gmatch(places, pattern) do
print(description)
print(kingdom)
end
--> The Cloud Kingdom is heavenly
--> Cloud Kingdom
--> The Forest Kingdom is peaceful
--> Forest Kingdomการค้นหารูปแบบนี้จะทำงานตามนี้:
ตัววนซ้ำ string.gmatch() จะมองหาการจับคู่ในแบบ "คำอธิบาย" ที่กำหนดโดยวงเล็บนอก นี่จะหยุดที่ เครื่องหมายจุลภาคแรกและจับคู่สิ่งต่อไปนี้:
| # | รูปแบบ | จับคู่ |
|---|---|---|
| 1 | (The%s(%a+%sKingdom)[%w%s]+) | The Cloud Kingdom is heavenly |
ใช้การจับคู่แรกที่ประสบความสำเร็จ ตัววนซ้ำจะมองหาการจับคู่ใน "ราชอาณาจักร" ที่กำหนดโดยวงเล็บใน ตัวแบบที่ซ้อนจะจับคู่ตามนี้:
| # | รูปแบบ | จับคู่ |
|---|---|---|
| 2 | (%a+%sKingdom) | Cloud Kingdom |
จากนั้นตัววนซ้ำจะถอยออกมาและจะทำการค้นหาต่อในสตริงทั้งหมด จับคู่ตามนี้:
| # | รูปแบบ | จับคู่ |
|---|---|---|
| 3 | (The%s(%a+%sKingdom)[%w%s]+) | The Forest Kingdom is peaceful |
| 4 | (%a+%sKingdom) | Forest Kingdom |
นอกเหนือจากทั้งหมดข้างต้น มีกรณีพิเศษที่เกี่ยวข้องกับ การจับข้อมูลเปล่า (()). หากการจับคู่นั้นว่างเปล่า ตำแหน่งในสตริงจะถูกจับได้:
local match1 = "Where does the capture happen? Who knows!"
local match2 = "This string is longer than the first one. Where does the capture happen? Who knows?!"
local pattern = "()Where does the capture happen%? Who knows!()"
local start1, finish1 = string.match(match1, pattern)
print(start1, finish1) --> 1 42
local start2, finish2 = string.match(match2, pattern)
print(start2, finish2) --> 43 84การจับคู่พิเศษเหล่านี้อาจซ้อนกันแบบปกติ:
local places = "The Cloud Kingdom is heavenly, The Forest Kingdom is peaceful."
local pattern = "The (%a+()) Kingdom is %a+"
for kingdom, position in string.gmatch(places, pattern) do
print(kingdom, position)
end
--> Cloud 10
--> Forest 42ค่าที่ส่งกลับมีลักษณะพิเศษคือเป็น จำนวน แทนที่จะเป็นสตริง:
local match = "This is an example"
local pattern = "This is an ()example"
local position = string.match(match, pattern)
print(typeof(position)) --> number