Chuỗi

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Loại dữ liệu chuỗi là một chuỗi các ký tự, như chữ cái, số và biểu tượng .Nó là loại dữ liệu để lưu trữ hầu hết thông tin dựa trên văn bản.

Tuyên bố chuỗi

Để tuyên bố một biến chuỗi, hãy đặt dấu ngoặc xung quanh các ký tự.Thông thường dùng dấu ngoặc kép ( " ), nhưng dấu ngoặc đơn ( ' ) cũng hoạt động.Nếu bạn muốn bao gồm một dấu nháy đơn hoặc nháy đôi trong chuỗi của bạn, bọc chuỗi của bạn xung quanh loại dấu nháy khác, hoặc sử dụng một dấu nháy thoát trích dẫn.


local string1 = "Hello world!"
print(string1) --> Xin chào thế giới!
local string2 = 'Hello "world"!'
print(string2) --> Hello "world"!

Để bao gồm cả dấu nhắc đơn và dấu nhắc đôi trong một chuỗi, hoặc để tạo các chuỗi nhiều dòng, xác định chúng bằng dấu ngoặc đơn:


local string1 = [[Hello
world!
Hello "world"!
Hello 'world'!]]
print(string1)
--> Xin chào
--> thế giới!
--> Xin chào "thế giới"!
--> Hello 'world'!

Nếu cần thiết, bạn có thể lồng nhiều dấu ngoặc trong một chuỗi bằng cùng số dấu bằng nhau ở cả phần mở đầu và phần kết thúc dấu ngoặc:


local string1 = [=[Hello
[[world!]]
]=]
print(string1)
--> Xin chào
--> [[world!]]

Kết hợp chuỗi

Để kết hợp các chuỗi, kết hợp chúng với hai chấm tròn ( .. ).Kết hợp các chuỗi không chèn một khoảng trống giữa chúng, vì vậy bạn sẽ cần phải bao gồm không gian (s) ở cuối/đầu của một chuỗi trước/sau, hoặc kết hợp một không gian giữa hai chuỗi.


local hello = "Hello"
local helloWithSpace = "Hello "
local world = "world!"
local string1 = hello .. world
local string2 = helloWithSpace .. world
local string3 = hello .. " " .. world
print(string1) --> Thế giới Helloworld!
print(string2) --> Xin chào thế giới!
print(string3) --> Hello world!

Lưu ý rằng lệnh print() nhận nhiều tham số và kết hợp chúng với không gian, vì vậy bạn có thể sử dụng , thay cho .. để tạo không gian trong print() đầu ra.


local hello = "Hello"
local world = "world"
local exclamationMark = "!"
print(hello .. world .. exclamationMark) --> Thế giới Helloworld!
print(hello, world .. exclamationMark) --> Xin chào thế giới!
print(hello, world, exclamationMark) --> Hello world !

Chuyển đổi chuỗi

Để chuyển một chuỗi thành một số, hãy sử dụng chức năng tonumber(). Nếu chuỗi không có đại diện số, tonumber() trả về nil .


local numericString = "123"
print(tonumber(numericString)) --> 123
local alphanumericString = "Hello123"
print(tonumber(alphanumericString)) --> nil

Thoát chuỗi

Để thoát khỏi một tuyên bố chuỗi dấu nhắc kép hoặc đơn và nhúng gần như bất kỳ nhân vật nào, hãy đặt một dấu hiệu lùi ( \ ) trước nhân vật.Ví dụ:

  • Để nhúng một dấu nhắc đơn trong một chuỗi dấu nhắc đơn, hãy sử dụng \' .
  • Để nhúng dấu ngoặc kép trong một chuỗi ngoặc kép, hãy sử dụng \" .

local string1 = 'Hello \'world\'!'
print(string1) --> Xin chào 'world'!
local string2 = "Hello \"world\"!"
print(string2) --> Hello "world"!

Một số nhân vật theo sau dấu lùi sản xuất ra các ký tự đặc biệt thay vì các ký tự bị trốn:

  • Để nhúng một dòng mới, sử dụng \n .
  • Để nhúng một tab ngang, sử dụng \t .

local string1 = "Hello\nworld!"
print(string1)
--> Xin chào
--> thế giới!
local string2 = "Hello\tworld!"
print(string2) --> Hello world!

Sự kết hợp chuỗi

Luau hỗ trợ biến thể chuỗi , một tính năng cho phép bạn chèn biểu hiện vào chuỗi.Sử dụng backticks ( ` ) để tuyên bố một chuỗi được biến đổi, sau đó thêm các biểu식 bên trong dấu ngoặc tròn:


local world = "world"
local string1 = `Hello {world}!`
print(string1) --> Hello world!

Mặc dù biến là sử dụng phổ biến nhất, bạn có thể sử dụng bất kỳ biểu hiện nào, bao gồm toán học:


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) --> Xin chào thế giới, 1 lần!
print(string2) --> Xin chào thế giới, 2 lần!
print(string3) --> Hello world a third time!

Các quy tắc trốn thoát tiêu chuẩn áp dụng cho backticks, curly brackets và backslashes:


local string1 = `Hello \`\{world\}\`!`
print(string1) --> Hello `{world}`!

Chuyển đổi toán học

Nếu bạn thực hiện các phép toán trên một chuỗi, Luau tự động chuyển chuỗi thành một số.Nếu chuỗi không có đại diện số, nó sẽ ném lỗi.


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

So sánh

Các chuỗi có thể được so sánh bằng cách sử dụng < , <= , >>= các operator so sánh dựa trên trật tự lexicographical dựa trên các mã ASCII của mỗi ký tự trong một chuỗi.Điều này sẽ dẫn đến các số trong chuỗi không được so sánh đúng, ví dụ, "100" sẽ ít hơn "20" , vì các bayt "0""1" có mã ASCII thấp hơn so với byte "2" .


print("Apple" < "apple") --> thật
print("Banana" < "apple") --> true (B là trước một trong ASCII)
print("number100" < "number20") --> true

Tham chiếu mẫu chuỗi

Một mẫu chuỗi là một kết hợp của các nhân vật mà bạn có thể sử dụng với string.match() , string.gmatch() , và các chức năng khác để tìm một mảnh, hoặc dòng con, của một chuỗi dài hơn.

Trận đấu trực tiếp

Bạn có thể sử dụng trùng lặp trực tiếp trong chức năng Luau như string.match() , ngoại trừ nhân vật ma thuật .Ví dụ, các lệnh này tìm kiếm từ Roblox trong một chuỗi:


local match1 = string.match("Welcome to Roblox!", "Roblox")
local match2 = string.match("Welcome to my awesome game!", "Roblox")
print(match1) --> Roblox
print(match2) --> nil

Lớp nhân vật

Các lớp nhân vật là cần thiết cho các tìm kiếm chuỗi tiên tiến hơn.Bạn có thể sử dụng chúng để tìm kiếm một cái gì đó không nhất thiết phải là ký tự nhưng phù hợp với một danh mục (lớp) đã biết, bao gồm chữ cái , số , khoảng trống , dấu chấm câu và nhiều hơn nữa.

Bảng sau đây hiển thị các lớp nhân vật chính thức cho các mẫu chuỗi Luau:

>

LớpBiểu diễnVí dụ trận hòa
.Bất kỳ nhân vật nào32kasGJ1%fTlk?@94
%aMột chữ cái hoa hay chữ cái thấp hơnaBcDeFgHiJkLmNoPqRsTuVwXyZ
%lMột chữ cái thấp hơnabcdefghijklmnopqrstuvwxyz
%uMột chữ cái hoa thượngABCDEFGHIJKLMNOPQRSTUVWXYZ
%dBất kỳ số (số) nào0123456789
%pBất kỳ ký tự chấm câu nào!@#;,.
%wMột ký tự alphanumeric (hoặc một chữ cái hoặc một số)aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789
%sMột không gian hoặc ký tự trống , \n , và \r
%cMột nhân vật điều khiển đặc biệt
%xMột nhân vật hexadecimal0123456789 ABCDEF
%z >Nhân tính NULL ( \0 )

Đối với các lớp ký tự một chữ như %a%s, chữ hoa đối应 lập tương ứng của lớp đại diện cho "ngược" của lớp.Ví ví dụ / trường hợp, %p đại diện cho một ký tự chấm câu trong khi %P đại diện cho tất cả các ký tự ngoại trừ chấm câu.

Nhân vật ma thuật

Có 12 "nhân vật ma thuật" được dành riêng cho mục đích đặc biệt trong các mẫu:

$%^*()
.[]+-?

Bạn có thể trốn thoát và tìm kiếm các nhân vật ma thuật bằng cách sử dụng biểu tượng %.Ví dụ, để tìm kiếm roblox.com , trốn khỏi biểu tượng . (thời gian) bằng cách trước tiên nó với một % như trong %. .


-- trang "roblox.com" phù hợp với "roblox#com" bởi vì khoảng thời gian được giải thích là "bất kỳ ký tự nào"
local match1 = string.match("What is roblox#com?", "roblox.com")
print(match1) --> roblox#com
-- Trốn khỏi khoảng với % để nó được giải thích như một ký tự khoảng trống
local match2 = string.match("I love roblox.com!", "roblox%.com")
print(match2) --> roblox.com

Mỏ neo

Bạn có thể tìm kiếm một mẫu ở đầu hoặc cuối của một chuỗi bằng cách sử dụng các biểu tượng ^$.


local start1 = string.match("first second third", "^first") -- Phù hợp vì "đầu tiên" ở đầu
print(start1) --> đầu tiên
local start2 = string.match("third second first", "^first") -- Không phù hợp vì "đầu tiên" không ở đầu
print(start2) --> không
local end1 = string.match("first second third", "third$") -- Phù hợp vì "thứ ba" ở kết thúc
print(end1) --> thứ ba
local end2 = string.match("third second first", "third$") -- Không phù hợp vì "thứ ba" không ở kết thúc
print(end2) --> nil

Bạn cũng có thể sử dụng cả ^$ để đảm bảo một mẫu chỉ phù hợp với toàn bộ chuỗi và không chỉ một phần nào đó của nó.


-- Sử dụng cả ^ và $ để phù hợp với toàn bộ chuỗi
local match1 = string.match("Roblox", "^Roblox$") -- Phù hợp vì "Roblox" là toàn bộ chuỗi (bình đẳng)
print(match1) --> Roblox
local match2 = string.match("I play Roblox", "^Roblox$") -- Không phù hợp vì "Roblox" không ở đầu và kết thúc
print(match2) --> không
local match3 = string.match("I play Roblox", "Roblox") -- Phù hợp vì "Roblox" nằm trong "Tôi chơi Roblox"
print(match3) --> Roblox

Biến thể lớp

Bởi chính nó, một lớp nhân vật chỉ phù hợp với một nhân vật trong một chuỗi.Ví ví dụ / trường hợp, mẫu sau ( "%d" ) bắt đầu đọc chuỗi từ trái sang phải, tìm định dạng đầu tiên ( 2 ), và dừng lại.


local match = string.match("The Cloud Kingdom has 25 power gems", "%d")
print(match) --> 2

Bạn có thể sử dụng biến thể với bất kỳ lớp nhân vật nào để kiểm soát kết quả:

Số lượngÝ nghĩa
+Phù hợp với 1 hoặc nhiều lớp nhân vật trước đó
-Phù hợp với ít lớp nhân vật tiền nhiệm nhất có thể
*Phù hợp với 0 hoặc nhiều hơn lớp nhân vật trước đó
?Phù hợp với 1 hoặc ít hơn lớp nhân vật tiền nhiệm
%nĐối với n giữa 19 , phù hợp với một chuỗi con bằng với n chuỗi bị thu nhập.
%bxyLượt bắt cân bằng phù hợp với x, y, và mọi thứ giữa ( ví dụ, %b() phù hợp với một cặp dấu ngoặc và mọi thứ giữa chúng)

Thêm một modifier vào cùng một mẫu ( "%d+" thay vì "%d" ), xuất ra 25 thay vì 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

Bộ sưu tập lớp

Bộ nên được sử dụng khi một lớp nhân vật đơn không thể làm toàn bộ công việc.Ví ví dụ / trường hợp, bạn có thể muốn phù hợp với cả chữ viết thường ( %l ) dấu chấm câu ( %p ) bằng một mẫu duy nhất.

Các bộ được xác định bởi dấu ngoặc [] xung quanh chúng.Trong ví dụ sau, hãy chú ý sự khác biệt giữa việc sử dụng một bộ ( "[%l%p]+" ) và không sử dụng một bộ ( "%l%p+" ).


local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- Bột set
print(match1) --> chào!!!
local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- Chưa đặt
print(match2) --> o!!!

Lệnh đầu tiên (thiết cài đặt) bảo Luau tìm cả các ký tự thường và dấu chấm câu.Với quantifier + được thêm sau toàn bộ cài đặt, nó tìm thấy tất cả các nhân vật đó ( ello!!! ), dừng lại khi nó đến không gian.

Trong lệnh thứ hai (không được đặt), quantifier + chỉ áp dụng cho lớp %p trước đó, vì vậy Luau chỉ nắm lấy chữ cái thứ nhất (o) trước chuỗi dấu chấm câu (!!!).

Giống như lớp nhân vật, các bộ có thể là "đối lập" với chính mình.Điều này được thực hiện bằng cách thêm một ký tự ^ tại đầu của cài đặt, ngay sau khi mở [ .Ví ví dụ / trường hợp, đại diện cho cả dấu chấm câu và khoảng trống, trong khi đại diện cho tất cả các ký tự ngoại trừ dấu chấm câu và khoảng trống.

Bộ cũng hỗ trợ phạm vi mà cho phép bạn tìm toàn bộ phạm vi phù hợp giữa một ký tự bắt đầu và kết thúc.Đây là một tính năng nâng cao được mô tả chi tiết hơn trong Hướng dẫn Lua 5.1.

Lấy chuỗi

Chuỗi lấy nắm bắt là các mẫu thân trong một mẫu.Chúng được bao gói trong dấu ngoặc () và được sử dụng để lấy (thu chiếm lấy) các chuỗi phù hợp và lưu chúng vào biến.Ví dụ, mẫu sau đây có hai lượt bắt, (%a+)(%d+), trả về hai chuỗi con khi có một tương thíchphù hợp thành công.


local pattern = "(%a+)%s?=%s?(%d+)"
local key1, val1 = string.match("TwentyOne = 21", pattern)
print(key1, val1) --> Hai mươi mốt 21
local key2, val2 = string.match("TwoThousand= 2000", pattern)
print(key2, val2) --> Hai nghìn 2000
local key3, val3 = string.match("OneMillion=1000000", pattern)
print(key3, val3) --> OneMillion 1000000

Trong mẫu trước, quantifier ? sau cả hai lớp %s là một thêm an toàn bởi vì nó làm cho không gian bên cạnh dấu = bắt buộc tùy chọn.Điều đó có nghĩa là trận đấu thành công nếu một (hoặc cả hai) không gian bị thiếu xung quanh dấu bằng nhau.

Việc bắt chuỗi cũng có thể được lồng nhau như ví dụ sau:


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
--> Vương quốc đám mây là thiên đường
--> Vương quốc đám mây
--> Vương quốc Rừng là hòa bình
--> Forest Kingdom

Việc tìm kiếm mẫu này hoạt động như sau:

Người xử lý string.gmatch() tìm kiếm một trùng lặp trên toàn bộ mẫu "mô miêu tả" được định nghĩa bởi cặp ngoài của dấu ngoặc.Điều này dừng lại ở dấu phẩy đầu tiên và bắt lấy những gì theo dõi:

#MẫuThu nhập
1(The%s (%a+%sVương quốc)[%w%s]+)Vương quốc đám mây là thiên đường

Sử dụng lần chiếm lấynhập thành công đầu tiên của nó, iterator sau đó tìm kiếm một trận phù hợp trên mẫu "vương quốc" được xác định bởi cặp dấu ngoặc trong bên trong.Mẫu lồng này chỉ đơn giản là thu nhận các theo dõi:

#MẫuThu nhập
2(%a+%sVương quốc)Vương quốc đám mây

Iterator sau đó quay lại và tiếp tục tìm kiếm toàn bộ chuỗi, thu nhận những điều theo dõi:

#MẫuThu nhập
3(The%s (%a+%sVương quốc)[%w%s]+)Vương quốc Rừng là hòa bình
4(%a+%sVương quốc)Vương quốc Rừng

Ngoài tất cả những điều trên, có một trường hợp đặc biệt với một bắt trống ( () ).Nếu một lượt thu là trống, thì vị trí trong chuỗi sẽ được thu thập:


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

Các lần thu nhập đặc biệt này có thể được xếp chồng lên như bình thường:


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
--> Đám mây 10
--> Forest 42

Các giá trị trả về không phổ biến vì chúng là số chứ không phải là chuỗi:


local match = "This is an example"
local pattern = "This is an ()example"
local position = string.match(match, pattern)
print(typeof(position)) --> number