ประเภทข้อมูล สตริง คือชุดของตัวอักษร เช่น ตัวอักษร ตัวเลข และสัญลักษณ์ มันเป็นประเภทข้อมูลสำหรับเก็บข้อมูลที่เป็นข้อความส่วนใหญ่
ประกาศสตริง
ในการประกาศตัวแปรสตริง ให้ใส่เครื่องหมายคำพูดรอบตัวอักษร มักจะใช้เครื่องหมายคำพูดคู่ ("), แต่เครื่องหมายคำพูดเดี่ยว (') ก็ใช้งานได้เช่นกัน หากคุณต้องการใส่เครื่องหมายคำพูดเดี่ยวหรือคู่ในสตริงของคุณ ให้ใช้สตริงในประเภทของเครื่องหมายคำพูดที่แตกต่างกัน หรือใช้ เครื่องหมายคำพูดที่ถูกเอาออก.
local string1 = "Hello world!"print(string1) --> Hello world!local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
หากต้องการรวมเครื่องหมายคำพูดเดี่ยวและคู่ในสตริงเดียวกัน หรือสร้างสตริงหลายบรรทัด ให้ประกาศใช้งานโดยใช้วงเล็บคู่:
local string1 = [[Helloworld!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 .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(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)) --> 123local 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 = 1local 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) --> 65print("55" - 10) --> 45print("55" * 10) --> 550print("55" / 10) --> 5.5print("55" % 10) --> 5print("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") --> trueprint("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) --> Robloxprint(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) --> firstlocal start2 = string.match("third second first", "^first") -- ไม่ตรงกันเพราะ "first" ไม่อยู่ที่จุดเริ่มต้นprint(start2) --> nillocal end1 = string.match("first second third", "third$") -- ตรงกันเพราะ "third" อยู่ที่ตอนท้ายprint(end1) --> thirdlocal end2 = string.match("third second first", "third$") -- ไม่ตรงกันเพราะ "third" ไม่อยู่ที่ตอนท้ายprint(end2) --> nil
คุณยังสามารถใช้ทั้ง ^ และ $ ร่วมกันเพื่อให้แน่ใจว่ารูปแบบตรงกันเฉพาะกับสตริงทั้งหมดและไม่เพียงแค่บางส่วน
-- การใช้ทั้ง ^ และ $ เพื่อตรงกันข้ามทั้งสตริงlocal match1 = string.match("Roblox", "^Roblox$") -- ตรงกันเพราะ "Roblox" คือสตริงทั้งหมด (ความเท่าเทียมกัน)print(match1) --> Robloxlocal match2 = string.match("I play Roblox", "^Roblox$") -- ไม่ตรงกันเพราะ "Roblox" ไม่อยู่ที่เริ่มต้นและจบprint(match2) --> nillocal 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) --> 2local 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 21local key2, val2 = string.match("TwoThousand= 2000", pattern)print(key2, val2) --> TwoThousand 2000local 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) doprint(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 42local 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) doprint(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