Loại dữ liệu chuỗi là một chuỗi các ký tự, chẳng hạn như chữ cái, số và ký hiệu. Đây là loại dữ liệu để lưu trữ hầu hết thông tin dựa trên văn bản.
Khai báo chuỗi
Để khai báo một biến chuỗi, hãy đặt dấu nháy xung quanh các ký tự. Thường thì, người ta hay sử dụng dấu nháy kép ("), nhưng dấu nháy đơn (') cũng có thể dùng. Nếu bạn muốn bao gồm một dấu nháy đơn hoặc dấu nháy kép trong chuỗi của bạn, hãy bao quanh chuỗi bằng loại dấu nháy khác, hoặc sử dụng một dấu nháy thoát.
local string1 = "Xin chào thế giới!"print(string1) --> Xin chào thế giới!local string2 = 'Xin chào "thế giới"!'print(string2) --> Xin chào "thế giới"!
Để bao gồm cả dấu nháy đơn và dấu nháy kép trong một chuỗi, hoặc để tạo chuỗi nhiều dòng, hãy khai báo chúng bằng cặp dấu ngoặc kép:
local string1 = [[Xin chàothế giới!Xin chào "thế giới"!Xin chào 'thế giới'!]]print(string1)--> Xin chào--> thế giới!--> Xin chào "thế giới"!--> Xin chào 'thế giới'!
Nếu cần thiết, bạn có thể lồng nhiều cặp dấu ngoặc trong một chuỗi bằng cách sử dụng số lượng dấu "=" bằng nhau ở cả dấu ngoặt đầu và cuối:
local string1 = [=[Xin chào[[thế giới!]]]=]print(string1)--> Xin chào--> [[thế giới!]]
Kết hợp các chuỗi
Để kết hợp các chuỗi, nối chúng lại với nhau bằng hai dấu chấm (..). Việc nối chuỗi sẽ không chèn một khoảng trống giữa chúng, vậy nên bạn cần bao gồm không gian ở cuối/bắt đầu của chuỗi trước/sau, hoặc nối một không gian giữa hai chuỗi.
local hello = "Xin chào"local helloWithSpace = "Xin chào "local world = "thế giới!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> XinchaoWorld!print(string2) --> Xin chào thế giới!print(string3) --> Xin chào thế giới!
Lưu ý rằng lệnh print() nhận nhiều tham số và kết hợp chúng với khoảng trống, vì vậy bạn có thể sử dụng , thay vì .. để cho phép có khoảng trống trong các đầu ra của print().
local hello = "Xin chào"local world = "thế giới"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> XinchaoWorld!print(hello, world .. exclamationMark) --> Xin chào thế giới!print(hello, world, exclamationMark) --> Xin chào thế giới !
Chuyển đổi chuỗi
Để chuyển đổi một chuỗi thành một số, sử dụng hàm tonumber(). Nếu chuỗi không có đại diện số, tonumber() sẽ trả về nil.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Xin chào123"print(tonumber(alphanumericString)) --> nil
Dấu nháy thoát chuỗi
Để thoát một chuỗi có dấu nháy đơn hoặc dấu nháy kép và nhúng hầu như bất kỳ ký tự nào, hãy đặt một dấu gạch chéo ngược (\) trước ký tự. Ví dụ:
- Để nhúng một dấu nháy đơn trong một chuỗi có dấu nháy đơn, sử dụng \'.
- Để nhúng một dấu nháy kép trong một chuỗi có dấu nháy kép, sử dụng \".
local string1 = 'Xin chào \'thế giới\'!'print(string1) --> Xin chào 'thế giới'!local string2 = "Xin chào \"thế giới\"!"print(string2) --> Xin chào "thế giới"!
Một số ký tự theo sau dấu gạch chéo ngược sẽ tạo ra ký tự đặc biệt thay vì ký tự thoát:
- Để nhúng một dòng mới, sử dụng \n.
- Để nhúng một tab ngang, sử dụng \t.
local string1 = "Xin chào\nthế giới!"print(string1)--> Xin chào--> thế giới!local string2 = "Xin chào\tthế giới!"print(string2) --> Xin chào thế giới!
Nội suy chuỗi
Luau hỗ trợ nội suy chuỗi, một tính năng cho phép bạn chèn biểu thức vào trong chuỗi. Sử dụng dấu backticks (`) để khai báo một chuỗi nội suy, sau đó thêm các biểu thức bên trong dấu ngoặc nhọn:
local world = "thế giới"local string1 = `Xin chào {world}!`print(string1) --> Xin chào thế giới!
Mặc dù biến là cách sử dụng phổ biến nhất, bạn có thể sử dụng bất kỳ biểu thức nào, bao gồm toán học:
local world = "thế giới"local number = 1local letters = {"w", "o", "r", "l", "d"}local string1 = `Xin chào {world}, {number} lần!`local string2 = `Xin chào {world}, {number + 1} lần!`local string3 = `Xin chào {table.concat(letters)} lần thứ ba!`print(string1) --> Xin chào thế giới, 1 lần!print(string2) --> Xin chào thế giới, 2 lần!print(string3) --> Xin chào thế giới lần thứ ba!
Các quy tắc thoát tiêu chuẩn áp dụng cho dấu backticks, dấu ngoặc nhọn và dấu gạch chéo ngược:
local string1 = `Xin chào \`\{world\}\`!`print(string1) --> Xin chào `{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 đổi chuỗi thành số. Nếu chuỗi không có đại diện số, nó sẽ ném ra một lỗi.
print("55" + 10) --> 65print("55" - 10) --> 45print("55" * 10) --> 550print("55" / 10) --> 5.5print("55" % 10) --> 5print("Xin chào" + 10) --> print("Xin chào" + 10):1: cố gắng thực hiện phép toán (cộng) trên chuỗi và số
So sánh
Chuỗi có thể được so sánh bằng các toán tử <, <=, > và >= so sánh theo thứ tự từ điển dựa trên mã ASCII của mỗi ký tự trong chuỗi. Điều này sẽ dẫn đến việc các số trong chuỗi không được so sánh đúng, ví dụ, "100" sẽ nhỏ hơn "20", vì các byte "0" và "1" có mã ASCII thấp hơn byte "2".
print("Táo" < "táo") --> trueprint("Chuối" < "táo") --> true (B đứng trước a trong ASCII)print("số100" < "số20") --> true
Tham chiếu mẫu chuỗi
Một mẫu chuỗi là một sự kết hợp của các ký tự mà bạn có thể sử dụng với string.match(), string.gmatch(), và các hàm khác để tìm một phần, hoặc chuỗi con, của một chuỗi dài hơn.
Khớp trực tiếp
Bạn có thể sử dụng khớp trực tiếp trong một hàm Luau như string.match(), ngoại trừ các ký 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("Chào mừng đến với Roblox!", "Roblox")local match2 = string.match("Chào mừng đến với trò chơi tuyệt vời của tôi!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
Lớp ký tự
Lớp ký tự là cần thiết cho các tìm kiếm chuỗi nâng cao hơn. Bạn có thể sử dụng chúng để tìm kiếm cái gì đó không nhất thiết phải cụ thể về ký tự mà nằm trong một loại (lớp) đã biết, bao gồm chữ cái, số, khoảng trắng, dấu câu, và nhiều thứ khác.
Bảng sau đây cho thấy các lớp ký tự chính thức cho mẫu chuỗi Luau:
| Lớp | Đại diện | Ví dụ Khớp |
|---|---|---|
| . | Bất kỳ ký tự nào | 32kasGJ1%fTlk?@94 |
| %a | Một chữ cái viết hoa hoặc viết thường | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
| %l | Một chữ cái viết thường | abcdefghijklmnopqrstuvwxyz |
| %u | Một chữ cái viết hoa | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
| %d | Bất kỳ số nào | 0123456789 |
| %p | Bất kỳ ký tự dấu câu nào | !@#;,. |
| %w | Một ký tự chữ và số (hoặc một chữ cái hoặc một số) | aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789 |
| %s | Một ký tự khoảng trắng hoặc trống | , \n, và \r |
| %c | Một ký tự điều khiển đặc biệt | |
| %x | Một ký tự hệ thập lục phân | 0123456789ABCDEF |
| %z | Ký tự NULL (\0) |
Đối với các lớp ký tự có một chữ cái như %a và %s, chữ cái tương ứng viết hoa đại diện cho "ngược lại" của lớp. Ví dụ, %p đại diện cho một ký tự dấu câu trong khi %P đại diện cho tất cả các ký tự ngoại trừ dấu câu.
Ký tự ma thuật
Có 12 "ký tự ma thuật" bị dành riêng cho các mục đích đặc biệt trong các mẫu:
| $ | % | ^ | * | ( | ) |
| . | [ | ] | + | - | ? |
Bạn có thể thoát và tìm kiếm các ký tự ma thuật bằng cách sử dụng ký hiệu %. Ví dụ, để tìm kiếm roblox.com, thoát ký hiệu . (dấu chấm) bằng cách đặt một % trước nó như trong %..
-- "roblox.com" khớp với "roblox#com" vì dấu chấm được diễn giải là "bất kỳ ký tự nào"local match1 = string.match("Roblox.com là gì?", "roblox.com")print(match1) --> roblox#com-- Thoát dấu chấm với % để nó được diễn giải như một ký tự dấu chấm bình thườnglocal match2 = string.match("Tôi yêu roblox.com!", "roblox%.com")print(match2) --> roblox.com
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 ký hiệu ^ và $.
local start1 = string.match("đầu thứ hai thứ ba", "^đầu") -- Khớp vì "đầu" nằm ở đầuprint(start1) --> đầulocal start2 = string.match("thứ ba thứ hai đầu", "^đầu") -- Không khớp vì "đầu" không nằm ở đầuprint(start2) --> nillocal end1 = string.match("đầu thứ hai thứ ba", "thứ ba$") -- Khớp vì "thứ ba" nằm ở cuốiprint(end1) --> thứ balocal end2 = string.match("thứ ba thứ hai đầu", "thứ ba$") -- Không khớp vì "thứ ba" không nằm ở cuốiprint(end2) --> nil
Bạn cũng có thể sử dụng cả ^ và $ cùng nhau để đảm bảo một mẫu khớp chỉ với chuỗi đầy đủ và không chỉ một phần của nó.
-- Sử dụng cả ^ và $ để khớp với một chuỗi đầy đủlocal match1 = string.match("Roblox", "^Roblox$") -- Khớp vì "Roblox" là chuỗi đầy đủ (công bằng)print(match1) --> Robloxlocal match2 = string.match("Tôi chơi Roblox", "^Roblox$") -- Không khớp vì "Roblox" không nằm ở đầu VÀ cuốiprint(match2) --> nillocal match3 = string.match("Tôi chơi Roblox", "Roblox") -- Khớp vì "Roblox" nằm trong "Tôi chơi Roblox"print(match3) --> Roblox
Các bộ điều chỉnh lớp
Bản thân mình, một lớp ký tự chỉ khớp với một ký tự trong một chuỗi. Ví dụ, mẫu sau ("%d") bắt đầu đọc chuỗi từ trái qua phải, tìm ký tự đầu tiên là một số (2), và dừng lại.
local match = string.match("Vương quốc Cloud có 25 viên năng lượng", "%d")print(match) --> 2
Bạn có thể sử dụng các bộ điều chỉnh với bất kỳ lớp ký tự nào để kiểm soát kết quả:
| Định lượng | Ý nghĩa |
|---|---|
| + | Khớp 1 hoặc nhiều hơn của lớp ký tự trước đó |
| - | Khớp ít nhất với lớp ký tự trước đó |
| * | Khớp 0 hoặc nhiều hơn của lớp ký tự trước đó |
| ? | Khớp 1 hoặc ít hơn của lớp ký tự trước đó |
| %n | Đối với n từ 1 đến 9, khớp với một chuỗi con bằng với chuỗi đã được n nắm bắt. |
| %bxy | Ký tự nắm bắt cân bằng khớp với x, y, và mọi thứ ở giữa (ví dụ, %b() khớp với một cặp dấu ngoặc đơn và mọi thứ bên trong chúng) |
Thêm một bộ điều chỉnh vào cùng một mẫu ("%d+" thay vì "%d"), sẽ phát ra 25 thay vì 2:
local match1 = string.match("Vương quốc Cloud có 25 viên năng lượng", "%d")print(match1) --> 2local match2 = string.match("Vương quốc Cloud có 25 viên năng lượng", "%d+")print(match2) --> 25
Tập hợp lớp
Tập hợp nên được sử dụng khi một lớp ký tự đơn không thể làm toàn bộ công việc. Ví dụ, bạn có thể muốn khớp cả chữ cái viết thường (%l) và ký tự dấu câu (%p) bằng cách sử dụng một mẫu duy nhất.
Tập hợp được định nghĩa bằng cách bao quanh chúng bằng dấu ngoặc vuông []. Trong ví dụ sau, hãy chú ý đến sự khác biệt giữa việc sử dụng một tập hợp ("[%l%p]+") và không sử dụng một tập hợp ("%l%p+").
local match1 = string.match("Xin chào!!! Tôi là một chuỗi khác.", "[%l%p]+") -- Tập hợpprint(match1) --> ello!!!local match2 = string.match("Xin chào!!! Tôi là một chuỗi khác.", "%l%p+") -- Không tập hợpprint(match2) --> o!!!
Lệnh đầu tiên (tập hợp) chỉ định Luau tìm cả ký tự viết thường và dấu câu. Với bộ điều chỉnh + được thêm vào sau toàn bộ tập hợp, nó tìm tất cả các ký tự đó (ello!!!), dừng lại khi nó đến khoảng trắng.
Trong lệnh thứ hai (không tập hợp), bộ điều chỉnh + chỉ áp dụng cho lớp %p trước đó, vì vậy Luau chỉ giữ ký tự viết thường đầu tiên (o) trước chuỗi dấu câu (!!!).
Giống như lớp ký tự, các tập hợp có thể là "đối lập" với chính chúng. Điều này được thực hiện bằng cách thêm một ký tự ^ ở đầu tập hợp, ngay sau dấu mở [. Ví dụ, "[%p%s]+" đại diện cho cả dấu câu và khoảng trắng, trong khi "[^%p%s]+" đại diện cho tất cả các ký tự ngoại trừ dấu câu và khoảng trắng.
Các tập hợp cũng hỗ trợ dải cho phép bạn tìm một dải hoàn tất các kết quả giữa một ký tự bắt đầu và một ký tự kết thúc. Đây là một tính năng nâng cao được trình bày chi tiết hơn trên Hướng dẫn Lua 5.1.
Nắm bắt chuỗi
Nắm bắt chuỗi captures là các phụ mẫu trong một mẫu. Những cái này được bao quanh trong dấu ngoặc đơn () và được sử dụng để nhận (nắm bắt) các chuỗi con khớp và lưu chúng vào các biến. Ví dụ, mẫu sau đây bao gồm hai nắm bắt, (%a+) và (%d+), mà trả về hai chuỗi con khi một khớp thành công.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("Hai mươi mốt = 21", pattern)print(key1, val1) --> Hai mươi mốt 21local key2, val2 = string.match("Hai ngàn = 2000", pattern)print(key2, val2) --> Hai ngàn 2000local key3, val3 = string.match("Một triệu = 1000000", pattern)print(key3, val3) --> Một triệu 1000000
Bộ điều chỉnh ? theo sau cả hai lớp %s là một bổ sung an toàn vì nó khiến khoảng trống ở cả hai bên của dấu = là tùy chọn. Điều này có nghĩa là khớp thành công nếu một (hoặc cả hai) khoảng trống thiếu xung quanh dấu bằng.
Trong hàm string.gsub(), bạn có thể bao gồm các nhóm nắm bắt trong chuỗi thay thế sử dụng %1, %2, %3, v.v., lên đến %9. Mặc dù Luau hỗ trợ tới 32 nhóm nắm bắt trước khi ném ra lỗi, bạn chỉ có thể tham chiếu chín nhóm đầu tiên với cú pháp này:
local str = "love2play Roblox"local pattern = "(%w+)(%d+)(%w+)%s+(%w+)"local replacement = "Tôi %1 %2 %3 %4!"local result = string.gsub(str, pattern, replacement)print(result) --> Tôi yêu 2 chơi Roblox!
Bạn cũng có thể lồng các nắm bắt chuỗi:
local places = "Vương quốc Cloud thì thiên đường, Vương quốc Rừng thì yên bình"local pattern = "(The%s(%a+%sKingdom)[%w%s]+)"for description, kingdom in string.gmatch(places, pattern) doprint(description)print(kingdom)end--> Vương quốc Cloud thì thiên đường--> Cloud Kingdom--> Vương quốc Rừng thì yên bình--> Rừng Kingdom
Tìm kiếm mẫu này hoạt động như sau:
Bộ lặp string.gmatch() tìm kiếm một khớp với toàn bộ "mẫu mô tả" được định nghĩa bởi cặp dấu ngoặc bên ngoài. Điều này dừng lại ở dấu phẩy đầu tiên và nắm bắt như sau:
| # | Mẫu | Nắm bắt |
|---|---|---|
| 1 | (The%s(%a+%sKingdom)[%w%s]+) | Vương quốc Cloud thì thiên đường |
Sử dụng nắm bắt đầu tiên thành công của nó, bộ lặp sau đó tìm kiếm một khớp với "mẫu vương quốc" được định nghĩa bởi cặp dấu ngoặc bên trong. Mẫu lồng này đơn giản nắm bắt như sau:
| # | Mẫu | Nắm bắt |
|---|---|---|
| 2 | (%a+%sKingdom) | Cloud Kingdom |
Sau đó, bộ lặp quay lại và tiếp tục tìm kiếm trong chuỗi đầy đủ, nắm bắt như sau:
| # | Mẫu | Nắm bắt |
|---|---|---|
| 3 | (The%s(%a+%sKingdom)[%w%s]+) | Vương quốc Rừng thì yên bình |
| 4 | (%a+%sKingdom) | Rừng Kingdom |
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 nắm bắt rỗng (()). Nếu một nắm bắt là rỗng, lúc đó vị trí trong chuỗi sẽ được nắm bắt:
local match1 = "Nơi nào nắm bắt diễn ra? Ai biết!"local match2 = "Chuỗi này dài hơn chuỗi đầu tiên. Nơi nào nắm bắt diễn ra? Ai biết?!"local pattern = "()Nơi nào nắm bắt diễn ra%? Ai biết!()"local start1, finish1 = string.match(match1, pattern)print(start1, finish1) --> 1 42local start2, finish2 = string.match(match2, pattern)print(start2, finish2) --> 43 84
Các nắm bắt đặc biệt này có thể được lồng vào như các nắm bắt bình thường:
local places = "Vương quốc Cloud thì thiên đường, Vương quốc Rừng thì yên bình."local pattern = "The (%a+()) Kingdom là %a+"for kingdom, position in string.gmatch(places, pattern) doprint(kingdom, position)end--> Cloud 10--> Rừng 42
Các giá trị trả về rất đặc biệt vì chúng là số thay vì chuỗi:
local match = "Đây là một ví dụ"local pattern = "Đây là một ()ví dụ"local position = string.match(match, pattern)print(typeof(position)) --> number