dize veri tipi, harfler, sayılar ve semboller gibi karakterlerin bir dizisidir. Çoğu metin tabanlı bilgiyi depolamak için kullanılan veri tipidir.
Dize Tanımlama
Bir dize değişkeni tanımlamak için, karakterlerin etrafına tırnak işareti koyun. Genelde çift tırnak (") kullanmak daha yaygındır, ancak tek tırnaklar da (') işe yarar. Dizenizde bir tek veya çift tırnak dahil etmek istiyorsanız, dizeyi diğer tür tırnak ile kaplayın ya da bir kaçış tırnağı kullanın.
local dize1 = "Merhaba dünya!"print(dize1) --> Merhaba dünya!local dize2 = 'Merhaba "dünya"!'print(dize2) --> Merhaba "dünya"!
Hem tek hem de çift tırnakları bir dizeye dahil etmek veya çok satırlı dizeler oluşturmak için çift parantez kullanın:
local dize1 = [[Merhabadünya!Merhaba "dünya"!Merhaba 'dünya'!]]print(dize1)--> Merhaba--> dünya!--> Merhaba "dünya"!--> Merhaba 'dünya'!
Gerekirse, dize içinde, hem başlangıç hem de bitiş parantezlerinde aynı sayıda eşit işareti kullanarak birden fazla parantezi iç içe geçirebilirsiniz:
local dize1 = [=[Merhaba[[dünya!]]]=]print(dize1)--> Merhaba--> [[dünya!]]
Dizeleri Birleştirme
Dizeleri birleştirmek için, birleştirme (..) kullanın. Dizeleri birleştirirken aralarına boşluk eklenmez, bu yüzden önceki veya sonraki dizeye boşluk(lar) dahil etmeniz veya iki dize arasında bir boşluk birleştirmeniz gerekecektir.
local merhaba = "Merhaba"local merhabaBosluk = "Merhaba "local dunya = "dünya!"local dize1 = merhaba .. dunyalocal dize2 = merhabaBosluk .. dunyalocal dize3 = merhaba .. " " .. dunyaprint(dize1) --> Merhabadünya!print(dize2) --> Merhaba dünya!print(dize3) --> Merhaba dünya!
print() komutunun birden fazla argüman alıp bunları boşluklarla birleştirdiğini unutmayın, bu yüzden print() çıktılarında boşluklar için .. yerine , kullanabilirsiniz.
local merhaba = "Merhaba"local dunya = "dünya"local unlem = "!"print(merhaba .. dunya .. unlem) --> Merhabadünya!print(merhaba, dunya .. unlem) --> Merhaba dünya!print(merhaba, dunya, unlem) --> Merhaba dünya !
Dizeleri Dönüştürme
Bir diziyi bir sayıya dönüştürmek için, tonumber() fonksiyonunu kullanın. Eğer dize bir sayılı temsili yoksa, tonumber() nil döner.
local sayisalDize = "123"print(tonumber(sayisalDize)) --> 123local alfanumerikDize = "Merhaba123"print(tonumber(alfanumerikDize)) --> nil
Dizeleri Kaçırma
Çift veya tek tırnak dize açıklamasını kaçırmak ve hemen hemen her karakteri gömmeden kullanmak için, karakterin önüne bir ters eğik çizgi (\) koyun. Örneğin:
- Tek tırnak içindeki bir tek tırnağı gömmek için \' kullanın.
- Çift tırnak içindeki bir çift tırnağı gömmek için \" kullanın.
local dize1 = 'Merhaba \'dünya\'!'print(dize1) --> Merhaba 'dünya'!local dize2 = "Merhaba \"dünya\"!"print(dize2) --> Merhaba "dünya"!
Ters eğik çizgilerden sonra gelen belirli karakterler kaçış karakterleri yerine özel karakterler üretir:
- Yeni satır eklemek için \n kullanın.
- Yatay sekme eklemek için \t kullanın.
local dize1 = "Merhaba\n dünya!"print(dize1)--> Merhaba--> dünya!local dize2 = "Merhaba\t dünya!"print(dize2) --> Merhaba dünya!
Dize Yerleştirme
Luau dize yerleştirmeyi destekler, bu özellik size ifadeleri dizelere yerleştirme imkanı tanır. Yerleştirme dizesi oluşturmak için geri tırnak işareti (`) kullanın, ardından ifadeleri süslü parantezler içinde ekleyin:
local dünya = "dünya"local dize1 = `Merhaba {dünya}!`print(dize1) --> Merhaba dünya!
Değişkenlerin en yaygın kullanımıdır, ancak matematik de dahil olmak üzere her ifade kullanılabilir:
local dünya = "dünya"local sayı = 1local harfler = {"w", "o", "r", "l", "d"}local dize1 = `Merhaba {dünya}, {sayı} kez!`local dize2 = `Merhaba {dünya}, {sayı + 1} kez!`local dize3 = `Merhaba {table.concat(harfler)} üçüncü kez!`print(dize1) --> Merhaba dünya, 1 kez!print(dize2) --> Merhaba dünya, 2 kez!print(dize3) --> Merhaba dünya üçüncü kez!
Geri tırnaklar, süslü parantezler ve ters eğik çizgiler için standart kaçış kuralları geçerlidir:
local dize1 = `Merhaba \`\{dünya\}\`!`print(dize1) --> Merhaba `{dünya}`!
Matematik Dönüşümü
Bir dizge üzerinde matematik işlemleri gerçekleştirdiğinizde, Luau otomatik olarak dizgeyi bir sayıya dönüştürür. Eğer dizge sayılı bir temsile sahip değilse, bir hata verir.
print("55" + 10) --> 65print("55" - 10) --> 45print("55" * 10) --> 550print("55" / 10) --> 5.5print("55" % 10) --> 5print("Merhaba" + 10) --> print("Merhaba" + 10):1: dizge ve sayı üzerinde aritmetik (toplama) gerçekleştirme girişimi
Karşılaştırmalar
Dizgeler <, <=, >, ve >= operatörleri kullanılarak karşılaştırılabilir, bu operatörler dizgedeki her karakterin ASCII kodlarına dayanarak leksikografik sıraya göre karşılaştırma yapar. Bu, dizgede olan sayıları doğru şekilde karşılaştırmayacağı anlamına gelir; örneğin, "100" ifadesi "20" ifadesinden daha küçük olacak çünkü "0" ve "1" baytlarının ASCII kodları bayt "2" den daha düşüktür.
print("Elma" < "elma") --> trueprint("Muz" < "elma") --> true (B, ASCII'de a'dan önce gelir)print("sayı100" < "sayı20") --> true
Dize Deseni Referansı
Bir dize deseni, string.match(), string.gmatch() ve diğer fonksiyonlarla kullanılabilen bir karakter kombinasyonudur, bu da daha uzun bir dizenin parçasını veya alt dizesini bulmanıza yardımcı olur.
Doğrudan Eşleşmeler
Doğrudan eşleşmeleri, string.match() gibi bir Luau fonksiyonunda kullanabilirsiniz, ancak büyüleyici karakterler hariçtir. Örneğin, bu komutlar bir dizedeki Roblox kelimesini arar:
local eşleşme1 = string.match("Roblox'a hoş geldiniz!", "Roblox")local eşleşme2 = string.match("Harika oyunumda hoş geldiniz!", "Roblox")print(eşleşme1) --> Robloxprint(eşleşme2) --> nil
Karakter Sınıfları
Karakter sınıfları, daha ileri düzey dize aramaları için gereklidir. Bunları, belirli karakterlere özel olmayan, ancak bilinen bir kategori (sınıf) içinde olan şeyleri aramak için kullanabilirsiniz; buna harfler, rakamsal karakterler, boşluklar, noktalama işaretleri ve daha fazlası dahildir.
Aşağıdaki tablo, Luau dize desenleri için resmi karakter sınıflarını göstermektedir:
| Sınıf | Temsil Eder | Örnek Eşleşme |
|---|---|---|
| . | Herhangi bir karakter | 32kasGJ1%fTlk?@94 |
| %a | Büyük veya küçük harf | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
| %l | Küçük harf | abcdefghijklmnopqrstuvwxyz |
| %u | Büyük harf | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
| %d | Herhangi bir rakam (sayı) | 0123456789 |
| %p | Herhangi bir noktalama karakteri | !@#;,. |
| %w | Alfanümerik karakter (ya bir harf ya da bir rakam) | aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789 |
| %s | Bir boşluk veya boşluk karakteri | , \n ve \r |
| %c | Özel kontrol karakteri | |
| %x | Bir onaltılık karakter | 0123456789ABCDEF |
| %z | NULL karakteri (\0) |
Tek harflerden oluşan karakter sınıfları (%a ve %s gibi), karşılık gelen büyük harf, sınıfın "tersini" temsil eder. Örneğin, %p noktalama karakterini temsil ederken, %P noktalamalar hariç tüm karakterleri temsil eder.
Büyüleyici Karakterler
Desenlerde özel amaçlar için rezerve edilen 12 "büyüleyici karakter" vardır:
| $ | % | ^ | * | ( | ) |
| . | [ | ] | + | - | ? |
Büyüleyici karakterleri % sembolü ile kaçırabilir ve arama yapabilirsiniz. Örneğin, roblox.com için arama yaparken, . (nokta) sembolünü, % ile öncelik vererek kaçırın, örneğin %..
-- "roblox.com" ifadesi "roblox#com" ile eşleşir çünkü nokta "herhangi bir karakter" olarak yorumlanırlocal eşleşme1 = string.match("roblox#com nedir?", "roblox.com")print(eşleşme1) --> roblox#com-- Noktayı % ile kaçıralım, böylece nokta harflerden oluşmuş bir karakter olarak yorumlansınlocal eşleşme2 = string.match("Ben roblox.com'u seviyorum!", "roblox%.com")print(eşleşme2) --> roblox.com
Ankrajlar
Bir dizenin başında veya sonunda bir deseni aramak için ^ ve $ sembollerini kullanabilirsiniz.
local başlangıç1 = string.match("birinci ikinci üçüncü", "^birinci") -- Eşleşir çünkü "birinci" başlangıçtaprint(başlangıç1) --> birincilocal başlangıç2 = string.match("üçüncü ikinci birinci", "^birinci") -- Eşleşmez çünkü "birinci" başlangıçta değilprint(başlangıç2) --> nillocal bitiş1 = string.match("birinci ikinci üçüncü", "üçüncü$") -- Eşleşir çünkü "üçüncü" sonundaprint(bitiş1) --> üçüncülocal bitiş2 = string.match("üçüncü ikinci birinci", "üçüncü$") -- Eşleşmez çünkü "üçüncü" sonunda değilprint(bitiş2) --> nil
Bir dizenin yalnızca tam eşleşmesini sağlamak için ^ ve $ sembollerini birlikte kullanabilirsiniz.
-- Tüm bir dizge üzerinde eşleşmek için hem ^ hem de $ kullanmalocal eşleşme1 = string.match("Roblox", "^Roblox$") -- Eşleşir çünkü "Roblox" tam dizedir (eşitlik)print(eşleşme1) --> Robloxlocal eşleşme2 = string.match("Ben Roblox oynuyorum", "^Roblox$") -- Eşleşmez çünkü "Roblox" ne başlangıçta NE de sonundaprint(eşleşme2) --> nillocal eşleşme3 = string.match("Ben Roblox oynuyorum", "Roblox") -- Eşleşir çünkü "Roblox", "Ben Roblox oynuyorum" içinde bulunurprint(eşleşme3) --> Roblox
Sınıf Modifikatörleri
Kendiliğinden, bir karakter sınıfı bir dizgede yalnızca bir karakteri eşleştirir. Örneğin, aşağıdaki desen ("%d") dizgeyi soldan sağa okuyarak ilk rakamı (2) bulur ve durur.
local eşleşme = string.match("Bulut Krallığında 25 güç mücevheri var", "%d")print(eşleşme) --> 2
Herhangi bir karakter sınıfı ile modifikatörler kullanarak sonucu kontrol edebilirsiniz:
| Nicelik Belirleyici | Anlamı |
|---|---|
| + | Önceki karakter sınıfından 1 veya daha fazlasını eşleştir |
| - | Önceki karakter sınıfından mümkün olduğunca azını eşleştir |
| * | Önceki karakter sınıfından 0 veya daha fazlasını eşleştir |
| ? | Önceki karakter sınıfından 1 veya daha azını eşleştir |
| %n | n 1 ile 9 arasında ise, n'inci yakalanan dizeye eşit bir alt dizeyi eşleştir. |
| %bxy | Dengeli eşleşme x, y ve aralarındaki her şeyi eşleştirir (örneğin, %b() bir çift parantez ve aralarındaki her şeyi eşleştirir) |
Aynı desene bir modifikatör eklemek ("%d+" yerine "%d"), 2 yerine 25 çıktısı verir:
local eşleşme1 = string.match("Bulut Krallığında 25 güç mücevheri var", "%d")print(eşleşme1) --> 2local eşleşme2 = string.match("Bulut Krallığında 25 güç mücevheri var", "%d+")print(eşleşme2) --> 25
Sınıf Setleri
Setler, tek bir karakter sınıfının tüm işi yapamayacağı durumlarda kullanılmalıdır. Örneğin, hem küçük harfleri (%l) hem de noktalama karakterlerini (%p) karşılaştırmak isteyebilirsiniz.
Setler, etraflarında köşeli parantezler [] ile tanımlanır. Aşağıdaki örnekte, bir set kullanmanın ("[%l%p]+") ve kullanmadığınızda ("%l%p+") ne gibi farklar yarattığını görebilirsiniz.
local eşleşme1 = string.match("Merhaba!!! Başka bir diziyim.", "[%l%p]+") -- Setprint(eşleşme1) --> erhaba!!!local eşleşme2 = string.match("Merhaba!!! Başka bir diziyim.", "%l%p+") -- Set değilprint(eşleşme2) --> e!!!
İlk komut (set), Luau'ya hem küçük harf karakterlerini hem de noktalama işaretlerini bulmasını söyler. Tüm setin arkasında bulunan + nicelik belirleyicisi ile birlikte tüm bu karakterleri (erhaba!!!) bulur.
İkinci komut (set olmayan), + nicelik belirleyici yalnızca önündeki %p sınıfına uygulanır, dolayısıyla Luau sadece ilk küçük harf karakterini (e) alır ve ardından gelen noktalama işaretleriyle (!!!) durur.
Karakter sınıflarında olduğu gibi, setler de kendilerinin "tersi" olabilir. Bunun için, setin başlangıcının hemen ardından ^ karakterini ekleyerek bunu yapabilirsiniz. Örneğin, "[%p%s]+" hem noktalama işaretlerini hem de boşlukları temsil ederken, "[^%p%s]+" ise noktalama işaretleri ve boşluklar hariç tüm karakterleri temsil eder.
Setler ayrıca, başlangıç ve bitiş karakteri arasında tüm eşleşmeleri bulmanızı sağlayan aralıkları destekler. Bu gelişmiş özellikler hakkında daha fazla bilgi edinebilirsiniz: Lua 5.1 Kılavuzu.
Dize Yakalamaları
Dizelerdeki yakalamalar, bir desen içindeki alt desenlerdir. Bunlar () içinde yer alır ve eşleşen alt dizeleri almak ve bunları değişkenlere kaydetmek için kullanılır. Örneğin, aşağıdaki desende iki yakalama bulunmaktadır, (%a+) ve (%d+), bunlar başarılı bir eşleşme durumunda iki alt dize döndürür.
local dize_desen = "(%a+)%s?=%s?(%d+)"local anahtar1, deger1 = string.match("YirmiBir = 21", dize_desen)print(anahtar1, deger1) --> YirmiBir 21local anahtar2, deger2 = string.match("İkiBin= 2000", dize_desen)print(anahtar2, deger2) --> İkiBin 2000local anahtar3, deger3 = string.match("BirMilyon=1000000", dize_desen)print(anahtar3, deger3) --> BirMilyon 1000000
? nicelik belirleyicisi, her iki %s sınıfının ardından geliyor, bu güvenli bir ektir çünkü = işaretinin etrafındaki boşluğu isteğe bağlı hale getirir. Yani, eşleşme başarılı olur eğer eşit işaretinin etrafında bir (veya her iki) boşluk eksikse.
string.gsub() fonksiyonunda, %1, %2, %3 vb. kullanarak değişim dizesinde yakalama gruplarını dahil edebilirsiniz, Luau toplamda 32 yakalama grubunu desteklese de, bu söz dizimiyle yalnızca ilk dokuzunu referans alabilirsiniz:
local dize = "aşk2oyuncak Roblox"local dize_desen = "(%w+)(%d+)(%w+)%s+(%w+)"local değiştir = "Ben %1 %2 %3 %4!"local sonuç = string.gsub(dize, dize_desen, değiştir)print(sonuç) --> Ben aşk 2 oyuncak Roblox!
Ayrıca dize yakalamalarını iç içe geçirebilirsiniz:
local mekanlar = "Bulut Krallığı cennet, Orman Krallığı huzurlu"local dize_desen = "(Bulut%s(%a+%sKrallığı)[%w%s]+)"for tanım, krallık in string.gmatch(mekanlar, dize_desen) doprint(tanım)print(krallık)end--> Bulut Krallığı cennet--> Bulut Krallığı--> Orman Krallığı huzurlu--> Orman Krallığı
Bu desen araması şu şekilde çalışır:
string.gmatch() yineleyicisi, dış parantez çiftinin tanımladığı "tanım" desenine bir eşleşme arar. Bu, ilk virgüle kadar durur ve şunları yakalar:
| # | Desen | Yakaladı |
|---|---|---|
| 1 | (Bulut%s(%a+%sKrallığı)[%w%s]+) | Bulut Krallığı cennet |
Başarılı ilk yakalayışı ile birlikte, yineleyici "krallık" deseninde bir eşleşme aramak için geri döner. Bu iç desen sadece şunu yakalar:
| # | Desen | Yakaladı |
|---|---|---|
| 2 | (%a+%sKrallığı) | Bulut Krallığı |
Daha sonra, yineleyici geri çekilir ve tam dizeyi aramaya devam eder, şu şekilde yakalar:
| # | Desen | Yakaladı |
|---|---|---|
| 3 | (Bulut%s(%a+%sKrallığı)[%w%s]+) | Orman Krallığı huzurlu |
| 4 | (%a+%sKrallığı) | Orman Krallığı |
Tüm yukarıdaki özelliklerin yanı sıra, boş bir yakalama (()) ile ilgili özel bir durum vardır. Eğer bir yakalama boşsa, o zaman dizgedeki pozisyon yakalanır:
local eşleşme1 = "Eşleşme nerede oluyor? Kim bilir!"local eşleşme2 = "Bu dize, ilkinden daha uzun. Eşleşme nerede oluyor? Kim bilir?!"local dize_desen = "()Eşleşme nerede oluyor%? Kim bilir!()"local başlangıç1, bitiş1 = string.match(eşleşme1, dize_desen)print(başlangıç1, bitiş1) --> 1 42local başlangıç2, bitiş2 = string.match(eşleşme2, dize_desen)print(başlangıç2, bitiş2) --> 43 84
Bu özel yakalamalar normal yakalamalar gibi iç içe geçebilir:
local mekanlar = "Bulut Krallığı cennet, Orman Krallığı huzurlu."local dize_desen = "Bulut (%a+()) Krallığı %a+"for krallık, pozisyon in string.gmatch(mekanlar, dize_desen) doprint(krallık, pozisyon)end--> Bulut 10--> Orman 42
Dönen değerler, string yerine sayı olarak sonuçlanır:
local eşleşme = "Bu bir örnek"local dize_desen = "Bu bir ()örnek"local pozisyon = string.match(eşleşme, dize_desen)print(typeof(pozisyon)) --> sayı