สตริง

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ประเภทข้อมูล สตริง เป็นลำดับของตัวอักษร เช่น ตัวเลข และสัญลักษณ์เป็นประเภทข้อมูลสำหรับการจัดเก็บข้อมูลเนื้อหาส่วนใหญ่ที่เป็นข้อความ

ประกาศสตริง

เพื่อประกาศตัวแปรสตริงให้ใส่เครื่องหมายอ้อมรอบตัวอักษรมันเป็นที่นิยมมากขึ้นที่จะใช้เครื่องหมายอ้อยคู่ ( " ), แต่เครื่องหมายอ้อยเดี่ยว ( ' ) ก็ทำงานได้เช่นกันหากต้องการรวมอ้างอิงเดียวหรือสองอ้างอิงในสตริงของคุณ ให้ห่อสตริงของคุณรอบอ้างอิงอื่นหรือใช้ อ้างอิงหลบหนี


local string1 = "Hello world!"
print(string1) --> สวัสดีชาวโลก!
local string2 = 'Hello "world"!'
print(string2) --> Hello "world"!

เพื่อรวมทั้งเครื่องหมายอ้อยเดียวและสองเท่าในสตริงหรือเพื่อสร้างสตริงหลายบรรทัด ประกาศใช้พวกเขาโดยใช้เครื่องหมายอ้อยคู่:


local string1 = [[Hello
world!
Hello "world"!
Hello 'world'!]]
print(string1)
--> สวัสดี
--> โลก!
--> สวัสดี "โลก"!
--> Hello 'world'!

หากจำเป็น คุณสามารถซ้อนลูกเล่นหลายอันภายในสตริงโดยใช้จํานวนเครื่องหมายเท่ากันเดียวกันในทั้งส่วนเริ่มต้นและส่วนจบ:


local string1 = [=[Hello
[[world!]]
]=]
print(string1)
--> สวัสดี
--> [[world!]]

รวมสตริง

เพื่อรวมสตริง, รวม พวกเขาด้วยจุลภาคสองจุด ( .. ).การรวมเขียนสตริงไม่ใส่ช่องว่างระหว่างพวกเขาดังนั้นคุณจะต้องรวมช่องว่าง (หรือหลายช่องว่าง) ที่ปลาย/ต้นของสตริงก่อนหน้า/ถัดไปหรือรวมช่องว่างระหว่างสองสตริง


local hello = "Hello"
local helloWithSpace = "Hello "
local world = "world!"
local string1 = hello .. world
local string2 = helloWithSpace .. world
local string3 = hello .. " " .. world
print(string1) --> โลกแห่งสีขาว!
print(string2) --> สวัสดีชาวโลก!
print(string3) --> Hello world!

โปรดทราบว่าคำสั่ง ใช้อาร์กิวเมนต์หลายอย่างและรวมพวกเขา ด้วยช่องว่าง ดังนั้นคุณสามารถใช้ แทน เพื่อให้ได้พื้นที่ในออก


local hello = "Hello"
local world = "world"
local exclamationMark = "!"
print(hello .. world .. exclamationMark) --> โลกแห่งสีขาว!
print(hello, world .. exclamationMark) --> สวัสดีชาวโลก!
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) --> สวัสดี 'โลก'!
local string2 = "Hello \"world\"!"
print(string2) --> Hello "world"!

ตัวอักษรบางตัวที่ตามด้วยช่องว่างผลิตตัวอักษรพิเศษแทนตัวอักษรที่หลบหนี:

  • เพื่อฝังบรรทัดใหม่ใช้ \n
  • เพื่อฝังแท็บแนวนอนใช้ \t

local string1 = "Hello\nworld!"
print(string1)
--> สวัสดี
--> โลก!
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) --> สวัสดีโลก, 1 ครั้ง!
print(string2) --> สวัสดีโลก 2 ครั้ง!
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") --> จริง
print("Banana" < "apple") --> จริง (B อยู่ก่อน a ใน ASCII)
print("number100" < "number20") --> true

การอ้างอิงรูปแบบสตริง

ลายสตริง คือการรวมตัวอักษรที่คุณสามารถใช้กับ , และฟังก์ชันอื่นๆ เพื่อค้นหาชิ้นส่วนหรือสตริงย่อยที่ยาวกว่า

การจับคู่โดยตรง

คุณสามารถใช้การจับคู่โดยตรงในฟังก์ชัน 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

Class

คลาสตัวอักษรเป็นสิ่งจำเป็นสำหรับการค้นหาสตริงที่ซับซ้อนมากขึ้นคุณสามารถใช้พวกเขาเพื่อค้นหาสิ่งที่ไม่จำเป็นต้องเฉพาะตัวละคร แต่อยู่ภายในหมวดหมู่ที่รู้จัก (คลาส) รวมถึง ตัวอักษร , ตัวเลข , ช่องว่าง , เครื่องหมายวาระ และอื่นๆ

ตารางต่อไปแสดงคลาสตัวละครอย่างเป็นทางการสำหรับลายสตริง Luau:

คลาสแทนตัวอย่างการจับคู่
.ตัวละครใดก็ได้32kasGJ1%fTlk?@94
%aตัวอักษรใหญ่หรือตัวอักษรเล็กaBcDeFgHiJkLmNoPqRsTuVwXyZ
%lตัวอักษรต่ำสุดabcdefghijklmnopqrstuvwxyz
%uตัวอักษรตัวเอกABCDEFGHIJKLMNOPQRSTUVWXYZ
%dตัวเลขใดก็ได้ (จํานวน)0123456789
%pตัวละครการจุดทศนิยมใดๆ!@#;,.
%wตัวอักษรที่มีตัวเลข (เช่นตัวอักษร หรือ ตัวเลข)abcDeFgHiJkLmNoPqRsTuVwXyZ0123456789
%sพื้นที่หรือตัวอักษรว่างเปล่า , \n และ \r
%cตัวควบคุมพิเศษ ตัวละคร
%xตัวละครหกตัวเลข0123456789 ABCDEF
%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#คอม
-- หลบหนีระยะเวลาด้วย % เพื่อให้ถูกตีความเป็นตัวอักษรระยะเวลาโดยตรง
local match2 = string.match("I love roblox.com!", "roblox%.com")
print(match2) --> roblox.com

เชือก

คุณสามารถค้นหาลายได้ที่จุดเริ่มต้นหรือจุดสิ้นสุดของสตริงโดยใช้สัญลักษณ์ ^ และ $


local start1 = string.match("first second third", "^first") -- ตรงกันเพราะ "ครั้งแรก" อยู่ตอนต้น
print(start1) --> ครั้งแรก
local start2 = string.match("third second first", "^first") -- ไม่ตรงกันเพราะ "ครั้งแรก" ไม่อยู่ตอนต้น
print(start2) --> ไม่มี
local end1 = string.match("first second third", "third$") -- ตรงกันเพราะ "ที่สาม" ปิด
print(end1) --> ที่สาม
local end2 = string.match("third second first", "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) --> ไม่มี
local match3 = string.match("I play Roblox", "Roblox") -- ตรงกันเพราะ "Roblox" อยู่ภายใน "ฉันเล่น 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) --> สวัสดี!!!
local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- ไม่ได้ตั้ง
print(match2) --> o!!!

คำสั่งแรก (ตั้งค่า) บอก Luau ให้ค้นหาตัวอักษรต่ำและเครื่องหมายวาระทั้งสองด้วยตัวบ่งบอกปริมาณ + ตั้งค่ามันจะค้นหา ทั้งหมด ของตัวละครเหล่านั้น ( ello!!! ) หยุดเมื่อมันถึงพื้นที่

ในคำสั่งที่สอง (ไม่ได้ตั้งค่า) ตัวเลขจํานวน + ใช้กับคลาส %p ก่อนหน้าเท่านั้น ดังนั้น Luau จะคว้าเฉพาะตัวอักษรเล็กตัวแรก ( o ) ก่อนลําดับการจุลภาค ( !!! )

Classชุดสามารถเป็น "คู่ตรงข้าม" ของตัวเองได้สิ่งนี้ทำได้โดยการเพิ่มตัวอักษร ^ ตั้งค่า อินสแตนซ์แทนที่ทั้งจุลภาคและช่องว่างในขณะที่ แทนที่ตัวอักษรทั้งหมด ยกเว้นจุลภาคและช่องว่าง

ชุดยังสนับสนุน ช่วง ซึ่งช่วยให้คุณสามารถค้นหาช่วงทั้งหมดของการจับคู่ระหว่างตัวละครเริ่มต้นและสิ้นสุดได้นี่เป็นคุณลักษณะขั้นสูงซึ่งอธิบายอย่างละเอียดใน คู่มือ Lua 5.1

การจับสตริง

สตริง จับ เป็นลายย่อยภายในลายเหล่านี้ถูกล้อมด้วยเครื่องหมายวงเล็บ () และใช้เพื่อรับ (จับภาพ) สตริงที่ตรงกันและบันทึกลงในตัวแปรตัวอย่างเช่น รูปแบบต่อไปนี้มีการจับสองรายการ (%a+) และ (%d+) ซึ่งจะส่งคืนสตริงย่อยสองรายการเมื่อมีการจับคู่ที่ประสบความสำเร็จ


local pattern = "(%a+)%s?=%s?(%d+)"
local key1, val1 = string.match("TwentyOne = 21", pattern)
print(key1, val1) --> ยี่สิบหนึ่ง 21
local key2, val2 = string.match("TwoThousand= 2000", pattern)
print(key2, val2) --> สองพัน 200
local key3, val3 = string.match("OneMillion=1000000", pattern)
print(key3, val3) --> OneMillion 1000000

ในรูปแบบก่อนหน้านี้คันทาง ? ที่ติดตามทั้งสองคลาส %s เป็นการเพิ่มความปลอดภัยเพราะทำให้พื้นที่ที่อยู่ทางด้านข้างของเครื่องหมาย = เป็นตัวเลือกได้ซึ่งหมายความว่าการจับคู่จะประสบความสำเร็จหากพื้นที่หนึ่ง (หรือทั้งสอง) หายไปรอบสัญลักษณ์เท่ากัน

การจับสตริงยังสามารถ ซ้อน เป็นตัวอย่างต่อไปนี้:


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
--> ราชอาณาจักรเมฆเป็นสวรรค์
--> ราชอาณาจักรเมฆ
--> ราชอาณาจักรป่าเป็นสันติภาพ
--> Forest Kingdom

การค้นหารูปแบบนี้ทำงานดังนี้:

ตัวอ่าน string.gmatch() คำอธิบาย"คําอธิบาย" ทั้งหมดที่กําหนดโดยคู่ภายนอกของเครื่องหมายเชิงเส้นสิ่งนี้หยุดที่จุลภาคแรกและจับภาพสิ่งต่อไปนี้:

#รูปแบบจับ
1(The%s(%a+%sKingdom)[%w%s]+)ราชอาณาจักรเมฆเป็นสวรรค์

โดยใช้การจับคู่ครั้งแรกที่ประสบความสำเร็จ ตัวนับจะมองหาการจับคู่ในรูปแบบ "ราชอาณาจักร" กำลังติดตาม:

#รูปแบบจับ
2(%a+%sอาณาเขต)ราชอาณาจักรเมฆ

จากนั้น iterator กำลังติดตาม:

#รูปแบบจับ
3(The%s(%a+%sKingdom)[%w%s]+)ราชอาณาจักรป่าเป็นสันติภาพ
4(%a+%sอาณาเขต)ราชอาณาจักรป่า

นอกจากทั้งหมดที่กล่าวมาแล้วยังมีกรณีพิเศษที่มี การจับภาพว่างเปล่า ( () )หากการจับภาพว่างเปล่าแล้วตำแหน่งในสตริงจะถูกจับ:


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
--> เมฆ 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