Typ danych string to sekwencja znaków, takich jak litery, liczby i symbole.Jest to typ danych do przechowywania większości informacji opartych na tekście.
Oświadcz struny
Aby zadeklarować zmienną strunę, umieść cudzysłowy wokół znaków.Wspólniejsze jest używanie cudzysłowów podwójnych ( " ), ale pojedyncze cudzysłowy ( ' ) również działają.Jeśli chcesz uwzględnić pojedynczą lub podwójną cytat w swojej ciąg, owiń swoją strunę wokół innego rodzaju cytatu lub użyj ucieczki ucieczki.
local string1 = "Hello world!"print(string1) --> Witaj świat!local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
Aby włączyć zarówno pojedyncze, jak i podwójne cytaty w ciągu jednej linii lub stworzyć wieloliniowe ciągi, zadeklaruj je za pomocą podwójnych nawiasów:
local string1 = [[Helloworld!Hello "world"!Hello 'world'!]]print(string1)--> Witaj--> świat!--> Witaj "świecie"!--> Hello 'world'!
Jeśli to konieczne, możesz zagnąć wiele nawiasów wewnątrz ciągu za pomocą tej samej liczby równych znaków zarówno w pierwszym, jak i ostatnim nawiasie:
local string1 = [=[Hello[[world!]]]=]print(string1)--> Witaj--> [[world!]]
Połącz struny
Aby połączyć struny, połącz je z dwoma kropkami ( .. ).Połączanie ciągów nie wstawia spacji między nimi, więc będziesz musiał dodać spację(i) na końcu/na początku poprzedniego/następnego ciągu lub połączyć spację między dwoma ciągami.
local hello = "Hello"local helloWithSpace = "Hello "local world = "world!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> Świat Hellowworld!print(string2) --> Witaj świat!print(string3) --> Hello world!
Zauważ, że polecenie print() wymaga wielu argumentów i łączy je z przestrzeniami, więc możesz użyć , zamiast .., aby wygenerować przestrzenie w print() wynikach.
local hello = "Hello"local world = "world"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> Świat Hellowworld!print(hello, world .. exclamationMark) --> Witaj świat!print(hello, world, exclamationMark) --> Hello world !
Konwertuj struny
Aby przekonwertować ciąg na liczbę, użyj funkcji tonumber(). Jeśli ciąg nie ma reprezentacji liczbowej, tonumber() zwraca nil.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Hello123"print(tonumber(alphanumericString)) --> nil
Ucieczka strun
Aby uniknąć deklaracji ciągu podwójnego lub pojedynczego cytatu i włączyć prawie każdą literę, umieść spacji ( \ ) przed literą.Na przykład:
- Aby wstawić pojedynczą cytat w jednej ciąg, użyj \'.
- Aby wstawić cudzysłów podwójny w ciągu podwójnego cudzysłowu, użyj \".
local string1 = 'Hello \'world\'!'print(string1) --> Witaj, "świecie"!local string2 = "Hello \"world\"!"print(string2) --> Hello "world"!
Niektóre znaki po znakach zaprzeczających wytwarzają specjalne znaki zamiast uciekłych znaków:
- Aby wstawić nową linię, użyj \n.
- Aby wstawić pionową zakładkę, użyj \t.
local string1 = "Hello\nworld!"print(string1)--> Witaj--> świat!local string2 = "Hello\tworld!"print(string2) --> Hello world!
Interpolacja ciągu
Luau wspiera interpolację strun , funkcję, która pozwala wstawiać wyrażenia do strun.Użyj backticków ( ` ), aby zadeklarować wstawioną ciąg, a następnie dodaj wyrażenia wewnątrz zakrzywionych nawiasów:
local world = "world"local string1 = `Hello {world}!`print(string1) --> Hello world!
Chociaż zmienne są najczęstszym użyciem, możesz używać dowolnej ekspresji, w tym matematyki:
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) --> Witaj światu, 1 raz!print(string2) --> Witaj światu, 2 razy!print(string3) --> Hello world a third time!
Standardowe reguły ucieczki obowiązują dla spacji, kłatek, i spacji:
local string1 = `Hello \`\{world\}\`!`print(string1) --> Hello `{world}`!
Konwersja matematyczna
Jeśli wykonasz operacje matematyczne na strunie, Luau automatycznie przekształca strunę w liczbę.Jeśli ciąg nie ma reprezentacji liczbowej, wyświetla błąd.
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
Porównania
Sznurki można porównać za pomocą operatorów <, <=, > i >=, które porównują za pomocą kolejności leksykalnej na podstawie kodów ASCII każdej litery w ciągu struny.Spowoduje to, że liczby w ciągach nie są porównywane poprawnie, na przykład "100" będzie mniejsze niż "20", ponieważ bajty "0" i "1" mają niższe kody ASCII niż bajt "2".
print("Apple" < "apple") --> prawdaprint("Banana" < "apple") --> prawda (B jest przed a w ASCII)print("number100" < "number20") --> true
Referencja wzoru ciągu
Wzór struny to kombinacja znaków, które możesz używać z string.match() , string.gmatch() i innymi funkcjami, aby znaleźć kawałek lub podstronę dłuższej ciąg.
Bezpośrednie mecze
Możesz używać bezpośrednich dopasowań w funkcji Luau takiej jak string.match(), z wyjątkiem magicznych znaków.Na przykład, te komendy szukają słowa Roblox w ciągu struny:
local match1 = string.match("Welcome to Roblox!", "Roblox")local match2 = string.match("Welcome to my awesome game!", "Roblox")print(match1) --> Robloxprint(match2) --> nil
Klasy postaci
Klasy postaci są niezbędne do bardziej zaawansowanych wyszukiwań strun.Możesz ich użyć do wyszukiwania czegoś, co niekoniecznie jest specyficzne dla znaków, ale pasuje do znanej kategorii (klasy), w tym litery , cyfry , spacje , znaki przecinkowe i więcej.
Poniższa tabela pokazuje oficjalne klasy postaci dla wzorców strun Luau:
Klasa | Reprezentuje | Przykładowy mecz |
---|---|---|
. | Dowolna postać | 32kasGJ1%fTlk?@94 |
%a | Duża lub mała litera | abcdefghijklmnopqrsztuvwxyz |
%l | Mała litera | abcdefghijklmnopqrstuvwxyz |
%u | Duża litera | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
%d | Dowolna liczba (number) | 0123456789 |
%p | Dowolny znak przecinkowy | !@#;,. |
%w | Alfanumeryczny znak (lub litera lub liczba) | abcdefghijklmnopqrsztuvwxyz0123456789 |
%s | Przestrzeń lub znak spacji | , \n , i \r |
%c | Specjalny charakter kontroli | |
%x | Sześciokrotny znak dwunastkowy | 0123456789 ABCDEF |
%z | Litera NULL ( \0 ) |
Dla klas literowych pojedynczych, takich jak %a i %s, odpowiednia wielka litera reprezentuje "przeciwieństwo" klasy.Na instancja%p reprezentuje znak przecinkowy, podczas gdy %P reprezentuje wszystkie znaki, z wyjątkiem znaku przecinkowego.
Magiczne znaki
Istnieją 12 "magicznych znaków", które są zarezerwowane do specjalnych celów w wzorcach:
$ | % | ^ | * | ( | ) |
. | [ | ] | + | - | ? |
Możesz uciec i szukać magicznych znaków za pomocą symbolu %.Na przykład, aby wyszukać roblox.com , ucieknij symbolowi . (okres) poprzedzając go % tak jak w %. .
-- „roblox.com” pasuje do „roblox#com”, ponieważ okres jest interpretowany jako „dowolna litera”local match1 = string.match("What is roblox#com?", "roblox.com")print(match1) --> roblox#com-- Ucieknij okresowi za pomocą %, aby był interpretowany jako znak okresu literalnegolocal match2 = string.match("I love roblox.com!", "roblox%.com")print(match2) --> roblox.com
Kotwice
Możesz wyszukać wzór na początku lub na końcu ciągu za pomocą symboli ^ i $.
local start1 = string.match("first second third", "^first") -- Dopasowania, ponieważ "pierwszy" jest na początkuprint(start1) --> najpierwlocal start2 = string.match("third second first", "^first") -- Nie pasuje, ponieważ "pierwszy" nie jest na początkuprint(start2) --> nillocal end1 = string.match("first second third", "third$") -- Dopasowania, ponieważ "trzeci" jest na kończyćprint(end1) --> trzecilocal end2 = string.match("third second first", "third$") -- Nie pasuje, ponieważ "trzeci" nie jest na kończyćprint(end2) --> nil
Możesz również użyć obu ^ i $ razem, aby zapewnić, że wzór pasuje tylko do całej strony, a nie tylko do jakiejś jej części.
-- Używanie zarówno ^ i $ do dopasowania na całej ciąglocal match1 = string.match("Roblox", "^Roblox$") -- Dopasowania, ponieważ "Roblox" to cała strona (równość)print(match1) --> Robloxlocal match2 = string.match("I play Roblox", "^Roblox$") -- Nie pasuje, ponieważ "Roblox" nie jest na początku I na kończyćprint(match2) --> nillocal match3 = string.match("I play Roblox", "Roblox") -- Dopasowania, ponieważ "Roblox" znajduje się w "Gram w Roblox"print(match3) --> Roblox
Modyfikatory klasy
Sama klasa postaci pasuje tylko do jednego znaku w ciągu struny.Na instancjanastępujący wzór ( "%d" ) zaczyna odczytywać ciąg od lewej do prawej, znajduje pierwszy cyfrę ( 2 ), a następnie się zatrzymuje.
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match) --> 2
Możesz używać modyfikatorów z dowolną klasą znaków, aby kontrolować wynik:
Licznik | Znaczenie |
---|---|
+ | Zapisz 1 lub więcej poprzedniej klasy znaków |
- | Dopasuj jak najmniej poprzedniej klasy postaci |
* | Zapisz 0 lub więcej poprzedniej klasy znaków |
? | Dopasuj 1 lub mniej poprzedniej klasy znaków |
%n | Dla n między 1 a 9, pasuje podstrunie równa n zapisanej ciąg. |
%bxy | Zrównoważone przechwyty pasujące do x, y i wszystkiego pomiędzy (na przykład %b() pasuje para nawiasów i wszystko pomiędzy nimi) |
Dodanie modyfikatora do tego samego wzorca ("%d+" zamiast "%d" ), wyświetla 25 zamiast 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
Zestawy klas
Zestawy powinny być używane, gdy pojedyncza klasa znaków nie może wykonać całej pracy.Na instancjamożesz chcieć dopasować zarówno małe litery ( ) i znaki przecinkowe ( ) za pomocą jednego wzoru.
Zestawy są określane przez nawiasy [] wokół nich.W następnym przykładzie zauważ różnicę między używaniem zestawu ( "[%l%p]+" ) a nie używaniem zestawu ( "%l%p+" ).
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- Ustawprint(match1) --> cześć!!!local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- Nieustawioneprint(match2) --> o!!!
Pierwsza komenda (ustawiać) mówi Luau, aby znaleźć zarówno małe litery, jak i znaki przecinkowe.Z dodanym kwantyfikatorem + po całym ustawiaćznajduje wszystkie z tych znaków ( ello!!! ), zatrzymując się, gdy dotrze do przestrzeni.
W drugiej komendzie (nieustawionej) kwantyfikator + dotyczy tylko klasy %p przed nią, więc Luau chwyta tylko pierwszą małą literę ( o ) przed serią znaków interpunkcyjnych ( !!! ).
Podobnie jak klasy postaci, zestawy mogą być "przeciwieństwami" siebie.Wykonuje się to poprzez dodanie znaku ^ na początku ustawiać, bezpośrednio po otwarciu [.Na instancja, reprezentuje zarówno znaki interpunkcyjne, jak i spacje, podczas gdy reprezentuje wszystkie znaki z wyjątkiem znaków interpunkcyjnych i spacji.
Zestawy wspierają również zakresy , które pozwalają znaleźć cały zakres meczów między początkowym i końcowym znakiem.Jest to zaawansowana funkcja, która jest opisana szczegółowo w Manualu Lua 5.1.
Przechwytywanie strun
Struny przechwyty są podwzorami wzorca.Są one zamknięte w nawiasach () i są używane do uzyskania (przechwytywać) pasujących podstrunek i zapisania ich do zmiennych.Na przykład następujący wzór zawiera dwa pojęcia, (%a+) i (%d+), które zwracają dwa podstrony po udanym dopasowywać.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("TwentyOne = 21", pattern)print(key1, val1) --> Dwadzieścia Jeden 21local key2, val2 = string.match("TwoThousand= 2000", pattern)print(key2, val2) --> Dwa Tysiące 2000local key3, val3 = string.match("OneMillion=1000000", pattern)print(key3, val3) --> OneMillion 1000000
W poprzednim wzorze kwantyfikator ?, który podąża za obiema klasami %s, jest bezpiecznym dodatkiem, ponieważ czyni przestrzeń po obu stronach znaku = opcjonalną.Oznacza to, że mecz powiedzie się, jeśli jedno (lub oba) miejsca zabraknie wokół znaku równości.
Przechwyty strun mogą również być zagniezione jak poniższy przykład:
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--> Królestwo chmur jest niebiańskie--> Królestwo chmur--> Królestwo lasów jest spokojne--> Forest Kingdom
Wzór wyszukiwania działa następująco:
Iterator string.gmatch() szuka dopasowania do całego wzorca "opis" określonego przez zewnętrzne pary nawiasów.To zatrzymuje się na pierwszej spacji i rejestruje obserwuje:
# | Wzór | Przechwyć |
---|---|---|
1 | (The%s/%a+%sKrólestwo)[%w%s]+) | Królestwo chmur jest niebiańskie |
Używając jego udanego pierwszego przechwytywać, iterator następnie szuka dopasowania wzoru "królestwa" określonego przez wewnętrzną parę nawiasów.Ten wzorzec hierarchiczny po prostu rejestruje obserwujeelementy:
# | Wzór | Przechwyć |
---|---|---|
2 | (%a+%sKrólestwo) | Królestwo chmur |
Iterator wtedy cofnie się i kontynuuje poszukiwanie całej ciąg, rejestrując obserwuje:
# | Wzór | Przechwyć |
---|---|---|
3 | (The%s/%a+%sKrólestwo)[%w%s]+) | Królestwo lasów jest spokojne |
4 | (%a+%sKrólestwo) | Królestwo lasów |
Oprócz wszystkiego powyżej, istnieje szczególny przypadek z pustym przechwytem ( () ).Jeśli rekord jest pusty, to pozycja w ciągu zostanie zarejestrowana:
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
Te specjalne rekordy mogą być zagnieżdżone tak jak zwykłe:
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--> Obchód 10--> Forest 42
Zwrócone wartości są niezwykłe, ponieważ są liczbami zamiast ciągami:
local match = "This is an example"local pattern = "This is an ()example"local position = string.match(match, pattern)print(typeof(position)) --> number