Tipe data string adalah sekumpulan karakter, seperti huruf, angka, dan simbol. Ini adalah tipe data untuk menyimpan sebagian besar informasi yang berbasis teks.
Meng deklarasikan string
Untuk mendeklarasikan variabel string, letakkan tanda kutip di sekitar karakter. Lebih umum menggunakan tanda kutip ganda ("), tetapi tanda kutip tunggal (') juga bisa digunakan. Jika Anda ingin menyertakan tanda kutip tunggal atau ganda dalam string Anda, bungkus string Anda dengan jenis kutipan yang lain, atau gunakan kutipan yang di-escape.
local string1 = "Hello world!"print(string1) --> Hello world!local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
Untuk menyertakan baik tanda kutip tunggal maupun ganda dalam string, atau untuk membuat string multi-baris, deklarasikan mereka menggunakan tanda kurung ganda:
local string1 = [[Helloworld!Hello "world"!Hello 'world'!]]print(string1)--> Hello--> world!--> Hello "world"!--> Hello 'world'!
Jika perlu, Anda bisa menumpuk beberapa tanda kurung di dalam string dengan menggunakan jumlah tanda sama yang sama di kedua tanda kurung awal dan akhir:
local string1 = [=[Hello[[world!]]]=]print(string1)--> Hello--> [[world!]]
Menggabungkan string
Untuk menggabungkan string, konkatenasi mereka dengan dua titik (..). Menggabungkan string tidak menyisipkan spasi di antara mereka, jadi Anda perlu menyertakan spasi di akhir/per awal dari string sebelumnya/berikutnya, atau menggabungkan spasi di antara kedua string tersebut.
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!
Perhatikan bahwa perintah print() mengambil beberapa argumen dan menggabungkannya dengan spasi, jadi Anda bisa menggunakan , alih-alih .. untuk menghasilkan spasi dalam output 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 !
Mengonversi string
Untuk mengonversi string menjadi angka, gunakan fungsi tonumber(). Jika string tersebut tidak memiliki representasi angka, tonumber() akan mengembalikan nil.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Hello123"print(tonumber(alphanumericString)) --> nil
Meng-escape string
Untuk meng-escape deklarasi string dengan tanda kutip ganda atau tunggal dan menyertakan hampir semua karakter, letakkan garis miring terbalik (\) sebelum karakter tersebut. Misalnya:
- Untuk menyertakan tanda kutip tunggal dalam string tanda kutip tunggal, gunakan \'.
- Untuk menyertakan tanda kutip ganda dalam string tanda kutip ganda, gunakan \".
local string1 = 'Hello \'world\'!'print(string1) --> Hello 'world'!local string2 = "Hello \"world\"!"print(string2) --> Hello "world"!
Karakter tertentu yang mengikuti garis miring terbalik menghasilkan karakter khusus alih-alih karakter yang di-escape:
- Untuk menyertakan baris baru, gunakan \n.
- Untuk menyertakan tab horizontal, gunakan \t.
local string1 = "Hello\nworld!"print(string1)--> Hello--> world!local string2 = "Hello\tworld!"print(string2) --> Hello world!
Interpolasi string
Luau mendukung interpolasi string, sebuah fitur yang memungkinkan Anda menyisipkan ekspresi ke dalam string. Gunakan tanda backtick (`) untuk mendeklarasikan string yang diinterpolasi, lalu tambahkan ekspresi di dalam kurung kurawal:
local world = "world"local string1 = `Hello {world}!`print(string1) --> Hello world!
Meskipun variabel adalah penggunaan yang paling umum, Anda dapat menggunakan ekspresi apa pun, termasuk matematika:
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!
Aturan peng-escape standar berlaku untuk backticks, kurung kurawal, dan garis miring terbalik:
local string1 = `Hello \`\{world\}\`!`print(string1) --> Hello `{world}`!
Konversi matematika
Jika Anda melakukan operasi matematika pada string, Luau secara otomatis mengonversi string menjadi angka. Jika string tersebut tidak memiliki representasi angka, akan menghasilkan kesalahan.
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
Perbandingan
String dapat dibandingkan menggunakan operator <, <=, > dan >= yang membandingkan menggunakan urutan leksikografis berdasarkan kode ASCII dari masing-masing karakter dalam string. Ini akan menyebabkan angka dalam string tidak dibandingkan dengan benar, misalnya, "100" akan kurang dari "20", karena byte "0" dan "1" memiliki kode ASCII yang lebih rendah daripada byte "2".
print("Apple" < "apple") --> trueprint("Banana" < "apple") --> true (B datang sebelum a dalam ASCII)print("number100" < "number20") --> true
Referensi pola string
Pola string adalah kombinasi karakter yang dapat digunakan dengan string.match(), string.gmatch(), dan fungsi lainnya untuk menemukan sebuah potongan, atau substring, dari string yang lebih panjang.
Pencocokan langsung
Anda dapat menggunakan pencocokan langsung dalam fungsi Luau seperti string.match(), kecuali untuk karakter ajaib. Sebagai contoh, perintah ini mencari kata Roblox dalam sebuah string:
local match1 = string.match("Welcome to Roblox!", "Roblox")local match2 = string.match("Welcome to my awesome game!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
Kelas karakter
Kelas karakter penting untuk pencarian string yang lebih canggih. Anda dapat menggunakannya untuk mencari sesuatu yang tidak selalu spesifik karakter tetapi pas dalam kategori (kelas) tertentu, termasuk huruf, angka, spasi, tanda baca, dan lainnya.
Tabel berikut menunjukkan kelas karakter resmi untuk pola string Luau:
| Kelas | Mewakili | Contoh Pencocokan |
|---|---|---|
| . | Karakter apapun | 32kasGJ1%fTlk?@94 |
| %a | Sebuah huruf besar atau kecil | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
| %l | Huruf kecil | abcdefghijklmnopqrstuvwxyz |
| %u | Huruf besar | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
| %d | Angka apapun | 0123456789 |
| %p | Karakter tanda baca apapun | !@#;,. |
| %w | Karakter alfanumerik (baik huruf atau angka) | aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789 |
| %s | Karakter spasi atau whitespace | , \n, dan \r |
| %c | Sebuah karakter kontrol khusus | |
| %x | Karakter heksadesimal | 0123456789ABCDEF |
| %z | Karakter NULL (\0) |
Untuk kelas karakter tunggal seperti %a dan %s, huruf besar yang sesuai mewakili "lawannya" kelas tersebut. Misalnya, %p mewakili karakter tanda baca sedangkan %P mewakili semua karakter kecuali tanda baca.
Karakter ajaib
Ada 12 "karakter ajaib" yang dikhususkan untuk tujuan khusus dalam pola:
| $ | % | ^ | * | ( | ) |
| . | [ | ] | + | - | ? |
Anda dapat meng-escape dan mencari karakter ajaib menggunakan simbol %. Sebagai contoh, untuk mencari roblox.com, escape simbol . (titik) dengan memperdalamnya dengan % seperti pada %..
-- "roblox.com" mencocokkan "roblox#com" karena titik diinterpretasikan sebagai "karakter apapun"local match1 = string.match("What is roblox#com?", "roblox.com")print(match1) --> roblox#com-- Escape titik dengan % sehingga diinterpretasikan sebagai karakter titik literallocal match2 = string.match("I love roblox.com!", "roblox%.com")print(match2) --> roblox.com
Penanda
Anda dapat mencari pola di awal atau akhir string dengan menggunakan simbol ^ dan $.
local start1 = string.match("first second third", "^first") -- Mencocokkan karena "first" ada di awalprint(start1) --> firstlocal start2 = string.match("third second first", "^first") -- Tidak mencocokkan karena "first" tidak ada di awalprint(start2) --> nillocal end1 = string.match("first second third", "third$") -- Mencocokkan karena "third" ada di akhirprint(end1) --> thirdlocal end2 = string.match("third second first", "third$") -- Tidak mencocokkan karena "third" tidak ada di akhirprint(end2) --> nil
Anda juga dapat menggunakan baik ^ dan $ bersama-sama untuk memastikan pola hanya mencocokkan string penuh dan tidak hanya sebagian dari itu.
-- Menggunakan baik ^ dan $ untuk mencocokkan di seluruh stringlocal match1 = string.match("Roblox", "^Roblox$") -- Mencocokkan karena "Roblox" adalah seluruh string (kesetaraan)print(match1) --> Robloxlocal match2 = string.match("I play Roblox", "^Roblox$") -- Tidak mencocokkan karena "Roblox" tidak ada di awal DAN akhirprint(match2) --> nillocal match3 = string.match("I play Roblox", "Roblox") -- Mencocokkan karena "Roblox" ada di dalam "I play Roblox"print(match3) --> Roblox
Modifikator kelas
Dengan sendirinya, kelas karakter hanya mencocokkan satu karakter dalam string. Misalnya, pola berikut ("%d") mulai membaca string dari kiri ke kanan, menemukan angka pertama (2), dan berhenti.
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match) --> 2
Anda bisa menggunakan modifikator dengan kelas karakter apapun untuk mengontrol hasilnya:
| Pengkuantitas | Arti |
|---|---|
| + | Cocokkan 1 atau lebih dari kelas karakter sebelumnya |
| - | Cocokkan sesedikit mungkin dari kelas karakter sebelumnya |
| * | Cocokkan 0 atau lebih dari kelas karakter sebelumnya |
| ? | Cocokkan 1 atau kurang dari kelas karakter sebelumnya |
| %n | Untuk n antara 1 dan 9, mencocokkan substring yang sama dengan string yang ke-n. |
| %bxy | Pencocokan tangkap berimbang yang mencocokkan x, y, dan semua yang ada di antara (misalnya, %b() mencocokkan sepasang tanda kurung dan semua yang ada di antara mereka) |
Menambahkan modifikator pada pola yang sama ("%d+" daripada "%d"), mengeluarkan 25 alih-alih 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
Kelas set
Set harus digunakan ketika satu kelas karakter tidak dapat melakukan seluruh pekerjaan. Misalnya, Anda mungkin ingin mencocokkan baik huruf kecil (%l) dan karakter tanda baca (%p) menggunakan satu pola.
Set didefinisikan dengan tanda kurung [] di sekitarnya. Dalam contoh berikut, perhatikan perbedaan antara menggunakan set ("[%l%p]+") dan tidak menggunakan set ("%l%p+").
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- Setprint(match1) --> ello!!!local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- Non-setprint(match2) --> o!!!
Perintah pertama (set) memberi tahu Luau untuk menemukan baik karakter huruf kecil dan tanda baca. Dengan kuantifier + ditambahkan setelah keseluruhan set, itu menemukan semua karakter tersebut (ello!!!), berhenti saat mencapai spasi.
Dalam perintah kedua (non-set), kuantifier + hanya diterapkan pada kelas %p sebelumnya, jadi Luau hanya menangkap karakter huruf kecil pertama (o) sebelum serangkaian tanda baca (!!!).
Seperti kelas karakter, set dapat memiliki "lawan" dari dirinya sendiri. Ini dilakukan dengan menambahkan karakter ^ di awal set, tepat setelah pembuka [. Misalnya, "[%p%s]+" mewakili baik tanda baca dan spasi, sementara "[^%p%s]+" mewakili semua karakter kecuali tanda baca dan spasi.
Set juga mendukung rentang yang memungkinkan Anda menemukan seluruh rentang kecocokan antara karakter awal dan akhir. Ini adalah fitur canggih yang dijelaskan lebih detail di dalam Manual Lua 5.1.
Tangkap string
Tangkap string adalah sub-pola dalam sebuah pola. Ini dibungkus dalam kurung () dan digunakan untuk mendapatkan (menangkap) substring yang cocok dan menyimpannya ke dalam variabel. Misalnya, pola berikut berisi dua tangkapan, (%a+) dan (%d+), yang mengembalikan dua substring setelah pencocokan berhasil.
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
Kuantifier ? yang mengikuti kedua kelas %s adalah tambahan yang aman karena membuat spasi di kedua sisi tanda = menjadi opsional. Itu berarti pencocokan berhasil jika salah satu (atau kedua) spasi hilang di sekitar tanda sama.
Dalam fungsi string.gsub(), Anda dapat menyertakan grup tangkap dalam string pengganti menggunakan %1, %2, %3, dst., hingga %9. Meskipun Luau mendukung hingga 32 grup tangkap sebelum menghasilkan kesalahan, Anda hanya dapat mereferensikan sembilan yang pertama dengan sintaks ini:
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!
Anda juga dapat menempatkan tangkapan string:
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
Pencarian pola ini bekerja sebagai berikut:
Iterators string.gmatch() mencari pencocokan pada seluruh pola "deskripsi" yang didefinisikan oleh pasang kurung luar. Ini berhenti di koma pertama dan menangkap yang berikut:
| # | Pola | Tangkap |
|---|---|---|
| 1 | (The%s(%a+%sKingdom)[%w%s]+) | The Cloud Kingdom is heavenly |
Menggunakan tangkapan pertamanya yang berhasil, iterator kemudian mencari pencocokan pada pola "kerajaan" yang didefinisikan oleh pasang kurung dalam. Pola bersarang ini hanya menangkap yang berikut:
| # | Pola | Tangkap |
|---|---|---|
| 2 | (%a+%sKingdom) | Cloud Kingdom |
Iterator kemudian mundur dan melanjutkan pencarian di string penuh, menangkap yang berikut:
| # | Pola | Tangkap |
|---|---|---|
| 3 | (The%s(%a+%sKingdom)[%w%s]+) | The Forest Kingdom is peaceful |
| 4 | (%a+%sKingdom) | Forest Kingdom |
Selain semua di atas, ada kasus khusus dengan sebuah tangkapan kosong (()). Jika sebuah tangkapan kosong, maka posisi dalam string akan ditangkap:
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
Tangkapan khusus ini dapat disarang seperti tangkapan normal:
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
Nilai yang dikembalikan tidak biasa karena merupakan angka alih-alih string:
local match = "This is an example"local pattern = "This is an ()example"local position = string.match(match, pattern)print(typeof(position)) --> number