dize veri türü, harfler, sayılar ve semboller gibi bir karakter dizisidir.En çok metne dayalı bilgi depolamak için veri türüdür.
Dize ilan et
Bir dize değişkenini ilan etmek için, karakterlerin etrafına tırnak işareti koyun.Çift tırnakları kullanmak daha yaygındır ( " ), ancak tek tırnaklar da çalışır ( ' ).Dizeye tek veya çift tırnak içermek istiyorsanız, dizeyi diğer türde bir alıntıya sarın veya kaçırılmış bir alıntı kullanın.
local string1 = "Hello world!"print(string1) --> Merhaba dünya!local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
Bir dizihem tek hem de çift tırnakları dahil etmek veya çok satırlı dize oluşturmak için, onları çift parantezler kullanarak ilan edin:
local string1 = [[Helloworld!Hello "world"!Hello 'world'!]]print(string1)--> Merhaba--> dünya!--> Merhaba "dünya"!--> Hello 'world'!
Gerekirse, başlangıç ve bitiş parantezlerinde aynı sayıda eşit işaret kullanarak bir dize içinde çok sayıda parantez yerleştirebilirsiniz:
local string1 = [=[Hello[[world!]]]=]print(string1)--> Merhaba--> [[world!]]
Dizeleri birleştir
Dizeleri birleştirmek için, bunları iki nokta ile birleştirin ( .. ).Metinleri birleştirmek aralarına bir boşluk eklemiyor, bu yüzden önceki/sonraki bir dize veya iki diziarasında bir boşluk eklemelisiniz veya iki metin arasında bir boşluk birleştirmelisiniz.
local hello = "Hello"local helloWithSpace = "Hello "local world = "world!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> Merhaba dünya!print(string2) --> Merhaba dünya!print(string3) --> Hello world!
komutasının çok sayıda argüman aldığını ve bunları ile birleştirdiğini unutmayın, böylece yerine boşlukları üretmek için yerine kullanabilirsiniz.
local hello = "Hello"local world = "world"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> Merhaba dünya!print(hello, world .. exclamationMark) --> Merhaba dünya!print(hello, world, exclamationMark) --> Hello world !
Dize dönüştürme
Bir dizeyi bir sayıya dönüştürmek için, tonumber() fonksiyonunu kullanın. Eğer dize bir sayı temsiline sahip değilse, tonumber() döndürür nil .
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Hello123"print(tonumber(alphanumericString)) --> nil
Dize kaçışları
Çift veya tek özel karakter içeren bir dize ifadesinden kaçınmak ve hemen hemen her karakteri içine yerleştirmek için, karakterin önüne bir tersbölü ( \ ) koyun.Örneğin:
- Tek bir alıntıyı tek bir diziiçinde yerleştirmek için, \' kullanın.
- Bir çift alıntıyı çift alıntı içinde yerleştirmek için, \" kullanın.
local string1 = 'Hello \'world\'!'print(string1) --> Merhaba 'world'!local string2 = "Hello \"world\"!"print(string2) --> Hello "world"!
Geri tersleri takip eden bazı karakterler kaçmış karakterler yerine özel karakterler üretir:
- Yeni bir satırı yerleştirmek için, \n kullanın.
- Dikey bir sekme yerleştirmek için, \t kullanın.
local string1 = "Hello\nworld!"print(string1)--> Merhaba--> dünya!local string2 = "Hello\tworld!"print(string2) --> Hello world!
Dize interpolasyonu
Luau, ip ifadesi yerleştirme özelliğini destekler, bir özellik sayesinde ifadeleri süzgeçlere yerleştirebilirsiniz.Bir karışık dize ilan etmek için geri tırnakları kullanın ( ` ), ardından kıvrık parantezler içine ifadeler ekleyin:
local world = "world"local string1 = `Hello {world}!`print(string1) --> Hello world!
Değişkenler en yaygın kullanım olmasına rağmen, matematik de dahil olmak üzere herhangi bir ifade kullanabilirsiniz:
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) --> Merhaba dünya, 1 kez!print(string2) --> Merhaba dünya, 2 kez!print(string3) --> Hello world a third time!
Standart kaçış kuralları geri tıklamalar, kavisli parantezler ve geri tersler için geçerlidir:
local string1 = `Hello \`\{world\}\`!`print(string1) --> Hello `{world}`!
Matematik dönüşümü
Bir diziüzerinde matematik işlemleri yaparsanız, Luau otomatik olarak dizeyi bir sayıya dönüştürür.Dize bir sayı temsiline sahip değilse, bir hata oluşur.
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
Karşılıklar
Dize karşılaştırmak için < , <= , > ve >= operatörlerini kullanarak, bir dize içindeki her bir karakterin ASCII kodlarına dayalı leksikal düzenle göre karşılaştırılabilir.Bu, örneğin, 'in düzgün karşılaştırılmadığı sayılara yol açar, çünkü baytlar ve daha düşük ASCII kodlarına sahiptir, çünkü bayt 'dan daha düşüktür.
print("Apple" < "apple") --> doğruprint("Banana" < "apple") --> true (B, ASCII'de birden önce)print("number100" < "number20") --> true
Dize model referansı
Bir dize modeli , , ve başka işlevlerle bir parçayı veya daha uzun bir diziparçasını bulmak için kullanabileceğiniz karakterlerin bir kombinasyonudur.
Doğrudan eşleşmeler
Luau işlevinde doğrudan eşleşmeleri kullanabilirsiniz, string.match() hariç sihirli karakterler .Örneğin, bu komutlar bir diziiçinde Roblox kelimesini arar:
local match1 = string.match("Welcome to Roblox!", "Roblox")local match2 = string.match("Welcome to my awesome game!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
Karakter sınıfları
Karakter sınıfları daha gelişmiş dize aramaları için gereklidir.Bunları kullanarak, harfler , sayılar , boşluklar , noktalama işaretleri ve daha fazlası dahil olmak üzere karakter spesifik olmayan ve bilinen bir kategori içinde yer alan bir şey arayabilirsiniz.
Aşağıdaki tablo, Luau dize desenleri için resmi karakter sınıflarını gösterir:
Sınıf | Temsil eder | Örnek Maçı |
---|---|---|
. | Herhangi bir karakter | %32kasGJ1%fTlk?@94 |
%a | Büyük veya küçük harf bir mektup | abcdefghijklmnopqrsztuvwxyz |
%l | Küçük harf bir mektup | abcdefghijklmnopqrstuvwxyz |
%u | Büyük harf bir mektup | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
%d | Herhangi bir sayı (number) | 0123456789 |
%p | Herhangi bir noktalama karakteri | !@#;,. |
%w | Alfanumerik bir karakter (harf veya bir sayı) | abcdefghijklmnopqrsztuvwxyz0123456789 |
%s | Bir boşluk veya boşluk karakteri | , \n ve \r |
%c | Özel bir kontrol karakteri | |
%x | Altıgen bir karakter | 0123456789ABCDEF |
%z | NULL karakteri ( \0 ) |
%a ve %s gibi tek harfli karakter sınıfları için, eşdeğer büyük harf, sınıfın "karşıtını" temsil eder.durum, %p bir virgül karakterini temsil ederken, %P tüm karakterleri virgül dışında temsil eder.
Büyülü karakterler
Desenlerde özel amaçlar için ayırılan 12 "büyülü karakter" vardır:
$ | % | ^ | * | ( | ) |
. | [ | ] | + | - | ? |
% sembolünü kullanarak sihirli karakterlerden kaçabilir ve arayabilirsiniz.Örneğin, roblox.com aramak için, önce bunu bir (nokta) sembolü ile çevirerek önceki (nokta) sembolünden kaçının.
-- roblox.com "roblox#com" eşleşir çünkü periyot "herhangi bir karakter" olarak yorumlanırlocal match1 = string.match("What is roblox#com?", "roblox.com")print(match1) --> roblox#com-- Yüzde ile süreyi kaçırarak, böylece süre bir kelime süre karakteri olarak yorumlanırlocal match2 = string.match("I love roblox.com!", "roblox%.com")print(match2) --> roblox.com
Kancalar
Bir dize başında veya sonunda bir model arayabilirsiniz ^ ve $ sembolleri kullanarak.
local start1 = string.match("first second third", "^first") -- Çünkü "ilk" başlangıçta olduğundan maçlar eşleşirprint(start1) --> ilklocal start2 = string.match("third second first", "^first") -- Eşleşmiyor çünkü "ilk" başlangıçta değilprint(start2) --> nulsüzlocal end1 = string.match("first second third", "third$") -- bitir"üçüncü" olduğundan eşleşirprint(end1) --> üçüncülocal end2 = string.match("third second first", "third$") -- Eşleşmiyor çünkü "üçüncü" bitirdeğilprint(end2) --> nil
Ayrıca, bir modelin sadece bütün diziyi değil, sadece bir kısmını değil garanti etmek için hem ^ hem de $ birlikte kullanabilirsiniz.
-- Tam bir diziboyunca eşleşmek için hem ^ hem de $'yi kullanmaklocal match1 = string.match("Roblox", "^Roblox$") -- Çünkü "Roblox" bütün dize olduğu için eşitlik nedeniyle eşleşirprint(match1) --> Robloxlocal match2 = string.match("I play Roblox", "^Roblox$") -- Eşleşmiyor çünkü "Roblox" başlangıçta VE bitirdeğilprint(match2) --> nulsüzlocal match3 = string.match("I play Roblox", "Roblox") -- Eşleşir çünkü "Roblox" "I play Roblox" içinde bulunurprint(match3) --> Roblox
Sınıf modifiye ediciler
Kendi başına, bir karakter sınıfı yalnızca bir diziiçinde bir karaktere eşleşir.durum, aşağıdaki model ( "%d" ) dizeyi soldan sağa okumaya başlar, ilk sayıyı bulur ( 2 ), ve durur.
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match) --> 2
sonuçkontrol etmek için herhangi bir karakter sınıfıyla modifiye edici kullanabilirsiniz:
Sayıcı | Anlamı |
---|---|
+ | Önceki karakter sınıfından 1 veya daha fazlası eşleştir |
- | Önceki karakter sınıfının en azından bir kısmıyla eşleşin olabildiğince |
* | Önceki karakter sınıfından 0 veya daha fazlası eşleştir |
? | Önceki karakter sınıfından 1 veya daha az eşleştirin |
%n | For n arasında 1 ve 9 arasında, yakalanan diziile eşit bir alt dizge bulur n. |
%bxy | Dengeli yakalama eşleşmesi x , y ve aralarındaki her şey (örneğin, %b() bir parantez çifti ve aralarındaki her şeyi eşleştirir) |
Aynı desene bir modifiye eklemek ( "%d+" yerine "%d" ), çıktı 25 yerine 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
Sınıf setleri
Setler tek bir karakter sınıfı tüm işi yapamadığında kullanılmalıdır.durum, hem küçük harfleri ( %l ) ve noktalama karakterlerini ( %p ) tek bir model kullanarak eşleştirmek isteyebilirsiniz.
Setler etraflarındaki parantezler tarafından tanımlanır [] .Aşağıdaki örnekte, bir set kullanımındaki farkı ( ) ve bir set kullanımındaki farkı ( ) gözlemleyin.
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- Ayarlandıprint(match1) --> merhaba!!!local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- Ayarılmamışprint(match2) --> o!!!
İlk komut (ayarla) Luau'ya hem küçük harfli karakterleri hem de noktalama işaretlerini bulmasını söyler.Tüm ayarlasonra eklenen sayıcı ile, bu karakterlerin tümünü bulur ( ), uzaya ulaştığında durur
İkinci komut (ayarlanmamış)da, + sayıcı yalnızca öncesindeki %p sınıfına uygulanır, bu yüzden Luau sadece ilk küçük harfi ( o ) seri noktalama öncesine yakalar ( !!! ).
Karakter sınıfları gibi, setler kendilerinin "zıttı" olabilir.Bunun yapılması için ayarlabaşına bir ^ karakteri eklenir, açılıştan hemen sonra [.durum, "[%p%s]+" noktalama ve boşlukları hem temsil eder, hem de "[^%p%s]+" tüm karakterleri noktalama ve boşluklar hariç temsil eder.
Setler ayrıca başlangıç ve bitiş karakterleri arasında bir dizi eşleşme bulmanıza izin veren menzilleri destekler.Bu, Lua 5.1 Kılavuzu üzerinde daha ayrıntılı olarak tanımlanan gelişmiş bir özelliktir.
Dize yakaları
Dize yakalar bir model içinde alt-kalıptır.Bunlar parantezler içinde () kapatılmıştır ve eşleşen alt dizilere ulaşmak ve değişkenlere kaydetmek için kullanılır.Örneğin, aşağıdaki model iki yakalama içerir, (%a+) ve (%d+), başarılı bir eşleşme sonucunda iki alt dizge döndürür.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("TwentyOne = 21", pattern)print(key1, val1) --> Yirmi Bir 21local key2, val2 = string.match("TwoThousand= 2000", pattern)print(key2, val2) --> İkiBin 2000local key3, val3 = string.match("OneMillion=1000000", pattern)print(key3, val3) --> OneMillion 1000000
Önceki modelde, her iki %s sınıfını takip eden ? sayıcı, çünkü = işaretinin her iki tarafındaki alanı zorunlu olmayan hale getiriyor, güvenli bir eklemektir.Bu, eşit işareti etrafında bir (veya her ikisi de) boşluk kaybolduğunda maçın başarılı olacağı anlamına gelir.
Dize yakaları ayrıca şu örnekte olduğu gibi iç içe geçmiş olabilir :
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--> Bulut Krallığı gökseldir--> Bulut Krallığı--> Orman Krallığı barışçıl--> Forest Kingdom
Bu model araması şu şekilde çalışır:
string.gmatch() döngüsü, ebeveyn parantezlerin dış tarafı tarafından tanımlanan tüm "açıklama" modelinde bir eşleşme arar.Bu ilk virgülde durur ve takip edilenyakalar:
# | Desenleri | Kapatma |
---|---|---|
1 | (The%s(%a+%sKingdom)[%w%s]+) | Bulut Krallığı gökseldir |
Başarılı ilk yakalamasını kullanarak, döngü sonra iç parantezlerin anahtarı tarafından tanımlanan "krallık" modelinde bir eşleşme arar.Bu çember içi model basitçe takip edilenyakalar:
# | Desenleri | Kapatma |
---|---|---|
2 | (%a+%sKrallık) | Bulut Krallığı |
Döngü sonra geri çekilir ve tüm diziyi arar, takip edilenyakalar:
# | Desenleri | Kapatma |
---|---|---|
3 | (The%s(%a+%sKingdom)[%w%s]+) | Orman Krallığı barışçıl |
4 | (%a+%sKrallık) | Orman Krallığı |
Yukarıdakilerin tümüne ek olarak, bir boş yakalama ile özel bir durum var (()).Bir yakalama boşsa, dize üzerindeki konum yakalanacaktır:
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
Bu özel yakalamalar normal olanlara benzer şekilde yerleştirilebilir:
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--> Bulut 10--> Forest 42
Geri döndürülen değerler, dizilere değil sayılar olmaları nedeniyle sıradışıdır:
local match = "This is an example"local pattern = "This is an ()example"local position = string.match(match, pattern)print(typeof(position)) --> number