Typ danych string to sekwencja znaków, takich jak litery, cyfry i symbole. To typ danych do przechowywania większości informacji tekstowych.
Deklarowanie napisów
Aby zadeklarować zmienną typu string, otocz znaki cudzysłowami. Częściej używa się podwójnych cudzysłowów ("), ale pojedyncze cudzysłowy (') również działają. Jeśli chcesz umieścić pojedynczy lub podwójny cudzysłów w swoim napisie, otocz swój napis drugim typem cudzysłowu lub użyj escapowanego cudzysłowu.
local string1 = "Witaj świecie!"print(string1) --> Witaj świecie!local string2 = 'Witaj "świecie"!'print(string2) --> Witaj "świecie"!
Aby uwzględnić zarówno pojedyncze, jak i podwójne cudzysłowy w napisie, lub utworzyć napisy wielowierszowe, zadeklaruj je używając podwójnych nawiasów:
local string1 = [[Witajświecie!Witaj "świecie"!Witaj 'świecie'!]]print(string1)--> Witaj--> świecie!--> Witaj "świecie"!--> Witaj 'świecie'!
W razie potrzeby możesz zagnieżdżać wiele nawiasów w napisie, używając takiej samej liczby znaków równości zarówno w początku, jak i na końcu nawiasu:
local string1 = [=[Witaj[[świecie!]]]=]print(string1)--> Witaj--> [[świecie!]]
Łączenie napisów
Aby połączyć napisy, konkatenować je za pomocą dwóch kropek (..). Łączenie napisów nie wstawia spacji między nimi, więc musisz uwzględnić spację na końcu/początku poprzedniego/następnego napisu, lub połączyć spację między dwoma napisami.
local hello = "Witaj"local helloWithSpace = "Witaj "local world = "świecie!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> Witajświecie!print(string2) --> Witaj świecie!print(string3) --> Witaj świecie!
Zauważ, że polecenie print() przyjmuje wiele argumentów i łączy je z spacjami, więc możesz użyć , zamiast .., aby uzyskać spacje w wynikach print().
local hello = "Witaj"local world = "świecie"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> Witajświecie!print(hello, world .. exclamationMark) --> Witaj świecie!print(hello, world, exclamationMark) --> Witaj świecie !
Konwertowanie napisów
Aby przekonwertować napis na liczbę, użyj funkcji tonumber(). Jeśli napis nie ma reprezentacji liczbowej, tonumber() zwraca nil.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Witaj123"print(tonumber(alphanumericString)) --> nil
Escapowanie napisów
Aby escape'ować deklarację napisu z podwójnym lub pojedynczym cudzysłowem i osadzić prawie każdy znak, umieść znak backslash (\) przed znakiem. Na przykład:
- Aby osadzić pojedynczy cudzysłów w napisie z pojedynczym cudzysłowem, użyj \'.
- Aby osadzić podwójny cudzysłów w napisie z podwójnym cudzysłowem, użyj \".
local string1 = 'Witaj \'świecie\'!'print(string1) --> Witaj 'świecie'!local string2 = "Witaj \"świecie\"!"print(string2) --> Witaj "świecie"!
Niektóre znaki następujące po backslashach produkują znaki specjalne, a nie escapowane znaki:
- Aby osadzić nową linię, użyj \n.
- Aby osadzić poziomy tabulator, użyj \t.
local string1 = "Witaj\nświecie!"print(string1)--> Witaj--> świecie!local string2 = "Witaj\tświecie!"print(string2) --> Witaj świecie!
Interpolacja napisów
Luau wspiera interpolację napisów, cechę, która pozwala na wstawienie wyrażeń do napisów. Użyj backticks (`), aby zadeklarować napis z interpolacją, a następnie dodaj wyrażenia w klamrach:
local world = "świecie"local string1 = `Witaj {world}!`print(string1) --> Witaj świecie!
Chociaż zmienne są najczęstszym użyciem, możesz używać dowolnego wyrażenia, w tym matematyki:
local world = "świecie"local number = 1local letters = {"s", "w", "i", "e", "c", "i", "e"}local string1 = `Witaj {world}, {number} raz!`local string2 = `Witaj {world}, {number + 1} razy!`local string3 = `Witaj {table.concat(letters)} po raz trzeci!`print(string1) --> Witaj świecie, 1 raz!print(string2) --> Witaj świecie, 2 razy!print(string3) --> Witaj świecie po raz trzeci!
Standardowe zasady escapowania stosują się również do backticków, klamr i backslashów:
local string1 = `Witaj \`\{world\}\`!`print(string1) --> Witaj `{world}`!
Konwersja matematyczna
Jeśli wykonujesz operacje matematyczne na napisie, Luau automatycznie konwertuje ten napis na liczbę. Jeśli napis nie ma reprezentacji liczbowej, wyrzuca błąd.
print("55" + 10) --> 65print("55" - 10) --> 45print("55" * 10) --> 550print("55" / 10) --> 5.5print("55" % 10) --> 5print("Witaj" + 10) --> print("Witaj" + 10):1: próba wykonania działań arytmetycznych (dodawania) na napisie i liczbie
Porównania
Napisy mogą być porównywane za pomocą operatorów <, <=, > i >=, które porównują według porządku leksykalnego na podstawie kodów ASCII każdego znaku w napisie. To spowoduje, że liczby w napisach nie będą porównywane poprawnie, na przykład "100" będzie mniejsze od "20", ponieważ bajty "0" i "1" mają niższe kody ASCII niż bajt "2".
print("Jabłko" < "jabłko") --> trueprint("Banan" < "jabłko") --> true (B jest przed a w ASCII)print("number100" < "number20") --> true
Referencja wzorców napisów
Wzorzec stringowy to kombinacja znaków, której można użyć z string.match(), string.gmatch() i innymi funkcjami, aby znaleźć fragment, lub podłańcuch, dłuższego napisu.
Bezpośrednie dopasowania
Możesz używać bezpośrednich dopasowań w funkcji Luau takiej jak string.match(), z wyjątkiem znaków magicznych. Na przykład, te polecenia szukają słowa Roblox w napisie:
local match1 = string.match("Witaj w Robloxie!", "Roblox")local match2 = string.match("Witaj w mojej niesamowitej grze!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
Klasy znaków
Klasy znaków są niezbędne do bardziej zaawansowanych wyszukiwań stringowych. Możesz ich używać, aby szukać czegoś, co niekoniecznie jest specyficzne dla znaków, ale mieści się w znanej kategorii (klasie), obejmującej litery, cyfry, spacje, znaki interpunkcyjne i inne.
Następująca tabela pokazuje oficjalne klasy znaków dla wzorców stringowych Luau:
| Klasa | Reprezentuje | Przykładowe dopasowanie |
|---|---|---|
| . | Dowolny znak | 32kasGJ1%fTlk?@94 |
| %a | Duża lub mała litera | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
| %l | Mała litera | abcdefghijklmnopqrstuvwxyz |
| %u | Duża litera | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
| %d | Dowolna cyfra (liczba) | 0123456789 |
| %p | Dowolny znak interpunkcyjny | !@#;,. |
| %w | Dowolny znak alfanumeryczny (litera lub cyfra) | aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789 |
| %s | Spacja lub znak białego miejsca | , \n, i \r |
| %c | Specjalny znak sterujący | |
| %x | Znak szesnastkowy | 0123456789ABCDEF |
| %z | Znak NULL (\0) |
Dla klas znaków jednoliterowych, takich jak %a i %s, odpowiadająca wielka litera reprezentuje "przeciwieństwo" klasy. Na przykład, %p reprezentuje znak interpunkcyjny, podczas gdy %P reprezentuje wszystkie znaki, z wyjątkiem znaków interpunkcyjnych.
Znaki magiczne
Istnieje 12 "znaków magicznych", które są zarezerwowane do specjalnych celów w wzorcach:
| $ | % | ^ | * | ( | ) |
| . | [ | ] | + | - | ? |
Możesz escapować i szukać znaków magicznych za pomocą symbolu %. Na przykład, aby wyszukać roblox.com, escape'uj symbol . (kropkę) wcześniejszym %, jak w %..
-- "roblox.com" dopasowuje się do "roblox#com", ponieważ kropka jest interpretowana jako "dowolny znak"local match1 = string.match("Co to jest roblox#com?", "roblox.com")print(match1) --> roblox#com-- Escape kropki z % tak, aby była interpretowana jako dosłowny znak kropkilocal match2 = string.match("Uwielbiam roblox.com!", "roblox%.com")print(match2) --> roblox.com
Kotwice
Możesz szukać wzorca na początku lub końcu napisu, używając symboli ^ i $.
local start1 = string.match("pierwszy drugi trzeci", "^pierwszy") -- Dopasowuje, ponieważ "pierwszy" jest na początkuprint(start1) --> pierwszylocal start2 = string.match("trzeci drugi pierwszy", "^pierwszy") -- Nie dopasowuje, ponieważ "pierwszy" nie jest na początkuprint(start2) --> nillocal end1 = string.match("pierwszy drugi trzeci", "trzeci$") -- Dopasowuje, ponieważ "trzeci" jest na końcuprint(end1) --> trzecilocal end2 = string.match("trzeci drugi pierwszy", "trzeci$") -- Nie dopasowuje, ponieważ "trzeci" nie jest na końcuprint(end2) --> nil
Możesz również używać zarówno ^, jak i $, aby upewnić się, że wzorzec dopasowuje się wyłącznie do całego napisu, a nie tylko jakiejś jego części.
-- Używanie zarówno ^, jak i $ do dopasowania całego napisulocal match1 = string.match("Roblox", "^Roblox$") -- Dopasowuje, ponieważ "Roblox" jest całym napisem (równość)print(match1) --> Robloxlocal match2 = string.match("Gram w Roblox", "^Roblox$") -- Nie dopasowuje, ponieważ "Roblox" nie jest na początku I końcuprint(match2) --> nillocal match3 = string.match("Gram w Roblox", "Roblox") -- Dopasowuje, ponieważ "Roblox" jest zawarte w "Gram w Roblox"print(match3) --> Roblox
Modyfikatory klas
Sama klasa znaków dopasowuje tylko jeden znak w napisie. Na przykład, następujący wzorzec ("%d") zaczyna czytać napis od lewej do prawej, znajduje pierwszą cyfrę (2) i zatrzymuje się.
local match = string.match("Królestwo Chmur ma 25 klejnotów mocy", "%d")print(match) --> 2
Możesz używać modyfikatorów z dowolną klasą znaków, aby kontrolować wynik:
| Kwantyfikator | Znaczenie |
|---|---|
| + | Dopasuj 1 lub więcej z poprzedniej klasy znaków |
| - | Dopasuj jak najmniej z poprzedniej klasy znaków, jak to możliwe |
| * | Dopasuj 0 lub więcej z poprzedniej klasy znaków |
| ? | Dopasuj 1 lub mniej z poprzedniej klasy znaków |
| %n | Dla n między 1 a 9, dopasowuje podłańcuch równy ntej złapanej strunie. |
| %bxy | Zbalansowane dopasowanie do x, y, i wszystkiego między nimi (na przykład, %b() dopasowuje parę nawiasów i wszystko, co między nimi) |
Dodanie modyfikatora do tego samego wzorca ("%d+" zamiast "%d"), zwraca 25 zamiast 2:
local match1 = string.match("Królestwo Chmur ma 25 klejnotów mocy", "%d")print(match1) --> 2local match2 = string.match("Królestwo Chmur ma 25 klejnotów mocy", "%d+")print(match2) --> 25
Zbiory klas
Zbiory powinny być używane, gdy pojedyncza klasa znaków nie jest w stanie wykonać całej pracy. Na przykład, możesz chcieć dopasować zarówno małe litery (%l), jak i znaki interpunkcyjne (%p) za pomocą jednego wzorca.
Zbiory definiuje się za pomocą nawiasów [] wokół nich. W poniższym przykładzie, zauważ różnicę pomiędzy używaniem zbioru ("[%l%p]+") i nie używaniem zbioru ("%l%p+").
local match1 = string.match("Witaj!!! Jestem innym napisem.", "[%l%p]+") -- Zbiórprint(match1) --> itaj!!!local match2 = string.match("Witaj!!! Jestem innym napisem.", "%l%p+") -- Bez zbioruprint(match2) --> t!!!
Pierwsze polecenie (zbiór) mówi Luau, aby znaleźć zarówno znaki małe, jak i znaki interpunkcyjne. Przy dodanym po nim kwantyfikatorze +, znajduje wszystkie te znaki (itaj!!!), zatrzymując się, gdy sięga do spacji.
W drugim poleceniu (bez zbioru), kwantyfikator + dotyczy tylko klasy %p przed nim, więc Luau łapie tylko pierwszy znak mały (t) przed serią interpunkcyjnych (!!!).
Podobnie jak klasy znaków, zbiory mogą mieć "przeciwieństwa" same w sobie. Dzieje się to poprzez dodanie znaku ^ na początku zbioru, bezpośrednio za otwierającym [ . Na przykład, "[%p%s]+" reprezentuje zarówno znaki interpunkcyjne, jak i spacje, podczas gdy "[^%p%s]+" reprezentuje wszystkie znaki z wyjątkiem znaków interpunkcyjnych i spacji.
Zbiory wspierają także zakresy, które pozwalają znaleźć cały zakres dopasowań między znakiem początkowym i końcowym. Jest to zaawansowana cecha, która jest szczegółowo opisana w Podręczniku Lua 5.1.
Złapanie napisów
Złapanie napisów to podwzorzec w wzorcu. Są one zamknięte w nawiasach () i służą do uzyskania (uchwycenia) pasujących podłańcuchów i zapisania ich w zmiennych. Na przykład, poniższy wzór zawiera dwa złapania, (%a+) i (%d+), które zwracają dwa podłańcuchy po udanym dopasowaniu.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("DwudziestuJeden = 21", pattern)print(key1, val1) --> DwudziestuJeden 21local key2, val2 = string.match("DwaTysiące= 2000", pattern)print(key2, val2) --> DwaTysiące 2000local key3, val3 = string.match("JednaMilion=1000000", pattern)print(key3, val3) --> JednaMilion 1000000
Kwantyfikator ?, który następuje po obu klasach %s, jest bezpiecznym dodatkiem, ponieważ czyni spację po obu stronach znaku = opcjonalną. Oznacza to, że dopasowanie powodzi, jeśli jedna (lub obie) spacje są pominięte wokół znaku równości.
W funkcji string.gsub() można включать grupy ujęć w ciąg zastępczy, używając %1, %2, %3 itd., aż do %9. Chociaż Luau wspiera aż 32 grupy ujęć przed wyrzuceniem błędu, możesz odwołać się tylko do pierwszych dziewięciu, używając tej składni:
local str = "miłość2zagrać w Roblox"local pattern = "(%w+)(%d+)(%w+)%s+(%w+)"local replacement = "Ja %1 %2 %3 %4!"local result = string.gsub(str, pattern, replacement)print(result) --> Ja miłość 2 zagrać w Roblox!
Możesz również zagnieżdżać złapania napisów:
local places = "Królestwo Chmur jest niebiańskie, Królestwo Lasu jest spokojne"local pattern = "(Królestwo%s(%a+%sKrólestwo)[%w%s]+)"for description, kingdom in string.gmatch(places, pattern) doprint(description)print(kingdom)end--> Królestwo Chmur jest niebiańskie--> Królestwo Chmur--> Królestwo Lasu jest spokojne--> Królestwo Lasu
To wyszukiwanie wzorców działa następująco:
Iterator string.gmatch() szuka dopasowania na całym wzorcu "opis", zdefiniowanym przez zewnętrzną parę nawiasów. Zatrzymuje się przy pierwszym przecinku i łapie następujące:
| # | Wzór | Ujęcie |
|---|---|---|
| 1 | (Królestwo%s(%a+%sKrólestwo)[%w%s]+) | Królestwo Chmur jest niebiańskie |
Używając swojego udanego pierwszego ujęcia, iterator następnie szuka dopasowania do wzoru "królestwo", zdefiniowanego przez wewnętrzną parę nawiasów. Ten zagnieżdżony wzór po prostu łapie następujące:
| # | Wzór | Ujęcie |
|---|---|---|
| 2 | (%a+%sKrólestwo) | Królestwo Chmur |
Iterator następnie cofa się i kontynuuje wyszukiwanie pełnego napisu, łapiąc następujące:
| # | Wzór | Ujęcie |
|---|---|---|
| 3 | (Królestwo%s(%a+%sKrólestwo)[%w%s]+) | Królestwo Lasu jest spokojne |
| 4 | (%a+%sKrólestwo) | Królestwo Lasu |
Oprócz wszystkich powyższych, istnieje specjalny przypadek z pustym ujęciem (()). Jeśli ujęcie jest puste, to pozycja w napisie zostanie uchwycona:
local match1 = "Gdzie odbywa się uchwycenie? Kto wie!"local match2 = "Ten napis jest dłuższy niż pierwszy. Gdzie odbywa się uchwycenie? Kto wie?!"local pattern = "()Gdzie odbywa się uchwycenie%? Kto wie!()"local start1, finish1 = string.match(match1, pattern)print(start1, finish1) --> 1 42local start2, finish2 = string.match(match2, pattern)print(start2, finish2) --> 43 84
Te specjalne ujęcia mogą być zagnieżdżane jak normalne:
local places = "Królestwo Chmur jest niebiańskie, Królestwo Lasu jest spokojne."local pattern = "Królestwo (%a+()) Królestwo jest %a+"for kingdom, position in string.gmatch(places, pattern) doprint(kingdom, position)end--> Chmur 10--> Lasu 42
Zwracane wartości są niezwykłe, ponieważ są to liczby, a nie napisy:
local match = "To jest przykład"local pattern = "To jest an ()przykład"local position = string.match(match, pattern)print(typeof(position)) --> number