Sznurki

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

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 = [[Hello
world!
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 .. world
local string2 = helloWithSpace .. world
local string3 = hello .. " " .. world
print(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)) --> 123
local 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 = 1
local 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) --> 65
print("55" - 10) --> 45
print("55" * 10) --> 550
print("55" / 10) --> 5.5
print("55" % 10) --> 5
print("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") --> prawda
print("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) --> Roblox
print(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:

KlasaReprezentujePrzykładowy mecz
.Dowolna postać32kasGJ1%fTlk?@94
%aDuża lub mała literaabcdefghijklmnopqrsztuvwxyz
%lMała literaabcdefghijklmnopqrstuvwxyz
%uDuża literaABCDEFGHIJKLMNOPQRSTUVWXYZ
%dDowolna liczba (number)0123456789
%pDowolny znak przecinkowy!@#;,.
%wAlfanumeryczny znak (lub litera lub liczba)abcdefghijklmnopqrsztuvwxyz0123456789
%sPrzestrzeń lub znak spacji , \n , i \r
%cSpecjalny charakter kontroli
%xSześciokrotny znak dwunastkowy0123456789 ABCDEF
%zLitera 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 literalnego
local 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ątku
print(start1) --> najpierw
local start2 = string.match("third second first", "^first") -- Nie pasuje, ponieważ "pierwszy" nie jest na początku
print(start2) --> nil
local end1 = string.match("first second third", "third$") -- Dopasowania, ponieważ "trzeci" jest na kończyć
print(end1) --> trzeci
local 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ąg
local match1 = string.match("Roblox", "^Roblox$") -- Dopasowania, ponieważ "Roblox" to cała strona (równość)
print(match1) --> Roblox
local match2 = string.match("I play Roblox", "^Roblox$") -- Nie pasuje, ponieważ "Roblox" nie jest na początku I na kończyć
print(match2) --> nil
local 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:

LicznikZnaczenie
+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
%nDla n między 1 a 9, pasuje podstrunie równa n zapisanej ciąg.
%bxyZró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) --> 2
local 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]+") -- Ustaw
print(match1) --> cześć!!!
local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- Nieustawione
print(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 21
local key2, val2 = string.match("TwoThousand= 2000", pattern)
print(key2, val2) --> Dwa Tysiące 2000
local 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) do
print(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órPrzechwyć
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órPrzechwyć
2(%a+%sKrólestwo)Królestwo chmur

Iterator wtedy cofnie się i kontynuuje poszukiwanie całej ciąg, rejestrując obserwuje:

#WzórPrzechwyć
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 42
local 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) do
print(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