Typ danych string jest to kolejka znaków, takich jak litery, numery i symbole. Jest to typ danych do przechowywania większości informacji bazowych.
Oświadczanie zmian
Aby zadeklarować zmienne strumieni, umieść cytaty wokół znaków. Jest powszechnie stosowane używanie podwójnych cytatów ( " ) lub pojedynczych cytatów ( ' ) również działa. Jeśli chcesz włączyć pojedynczy czy podwójny cytat w swojej wierszu, otul swoją wiersz wokół innego typu cytatu lub użyj ucieczki
local string1 = "Hello world!"print(string1) --> Cześć świata!local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
Aby włączyć pojedyncze i podwójne cytaty w ciągu, lub stworzyć wielostrzępne ciągi, zadeklaruj je używając podwójnych nawiasów:
local string1 = [[Helloworld!Hello "world"!Hello 'world'!]]print(string1)--> Witaj--> świat!--> Cześć "świata"!--> Hello 'world'!
Jeśli to konieczne, możesz zagnądzać wiele napełnionych nawiasów w ciągu używając tego samego liczby znaków w początkowym i końcowym nawiasie:
local string1 = [=[Hello[[world!]]]=]print(string1)--> Witaj--> [[world!]]
Łączenie smyczy
Aby połączyć strły, łącz je ze sobą za pomocą dwóch krop ( .. ). Łączenie stron nie wstawia przestrzeni między nimi, więc będziesz musiał włączyć przestrzeń(y) na końcu/początku poprzedniego/śledniego ciąg, lub łączyć przestrzeń między dwoma strzymi.
local hello = "Hello"local helloWithSpace = "Hello "local world = "world!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> Helloworld!print(string2) --> Cześć świata!print(string3) --> Hello world!
Uwaga, że komenda print() wymaga wiele argumentów i łączy je z przestrzeniami, więc możesz użyć , zamiast 2>..2>, aby wydać przestrzenie w wynikach 5>print()5>.
local hello = "Hello"local world = "world"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> Helloworld!print(hello, world .. exclamationMark) --> Cześć świata!print(hello, world, exclamationMark) --> Hello world !
Konwersja Strings
Aby przekonać ciąg pusty w liczbę, użyj funkcji tonumber(). Jeśli ciąg nie ma przedstawienia liczbowego, tonumber() zwraca nil.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Hello123"print(tonumber(alphanumericString)) --> nil
Ucieczka z wiązań
Aby uciec od podwójnej lub pojedynczej deklaracji zmiany znaku i wbudować prawie każdego postaci, umieść znak wygwiazdkowania ( \ ) przed postacią. Na przykład:
- Aby wbudować pojedynczy cytat w pojedynczych wierszach, użyj \' .
- Aby wbudować podwójne cytat w podwójnej wiadomości cytatowej, użyj \" .
local string1 = 'Hello \'world\'!'print(string1) --> Cześć "świata"!local string2 = "Hello \"world\"!"print(string2) --> Hello "world"!
Niektóre znaki po naciskach backspace'u produkują specjalne znaki, a nie ucieczki znaków:
- Aby wstawić nową linię, użyj \n .
- Aby wstawić poziomą zakładkę, użyj \t .
local string1 = "Hello\nworld!"print(string1)--> Witaj--> świat!local string2 = "Hello\tworld!"print(string2) --> Hello world!
Przetłumaczenie znaków
Luau wspiera interpretację ciągów znaków , która umożliwia wstawienie wyrażeń do ciągów znaków. Użyj znaczników ( ` ) do deklarowania interpretowanej ciągiem znaków, a następnie dodaj wyrażenia w środku nawiasów:
local world = "world"local string1 = `Hello {world}!`print(string1) --> Hello world!
Chociaż zmienne są najczęściej używane, możesz użyć dowolnej wyrażenia, 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) --> Cześć świata, 1 raz!print(string2) --> Cześć świata, 2 razy!print(string3) --> Hello world a third time!
Standardowe zasady ucieczki mają zastosowanie do backticks, curly brackets i backslashes:
local string1 = `Hello \`\{world\}\`!`print(string1) --> Hello `{world}`!
Konwersja matematyczna
Jeśli wykonasz na ciągoperacje matematyczne, Luau automatycznie konwertuje łańcuch w liczbę. Jeśli łańcuch nie ma przedstawienia liczbowego, to błądzi.
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
Strings można porównać używając <code><code> <code> <code> <code> <code> <code> <code> <code> <code> <
print("Apple" < "apple") --> prawdziwyprint("Banana" < "apple") --> prawdziwy (B jest przed A w ASCII)print("number100" < "number20") --> true
Referencja wzorca strumieni
Pattern stron jest kombinacją znaków, które możesz użyć z Library.string.dopasowywać(), string.match() i innymi funkcjami, aby znaleźć kawałek lub podstronę dłuższego ciągu.
Bezpośrednie mecze
Możesz używać bezpośrednich dopasów w funkcji Luau, takiej jak string.match(), z wyjątkiem znaków magicznych. Na przykład, te komendy szukają słowa Roblox w ciągu strzyżki:
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 znaków są niezbędne dla bardziej zaawansowanych wyszukiwań strungowych. Możesz ich używać do wyszukiwania czegoś, co nie jest niezbędnie klasowe, ale pasuje do znanej kategorii (klasy), w tym litery, cyfry, przestrzenie, 2> przerwy2> i wiele więcej.
Poniższy tabela pokazuje oficjalne klasy postaci dla wzorów strumieni Luau:
Klasa | Reprezentuje | Przykładowy mecz |
---|---|---|
. | Dowolny znak | 32kasGJ1%fTlk?@94 |
%a | Mała lub duża litera | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
%l | Mniejsza litra | abcdefghijklmnopqrstuvwxyz |
%u | Górna litra | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
%d | Dowolna liczba (number) | 0123456789 |
%p | Dowolny znak zapisu | !@#;,. |
%w | Alfanumeryczny znak (czyt. litera lub liczba) | aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789 |
%s | Przestrzeń lub białą przestrzeń postaci | \r |
%c | Specjalny postać sterowania | |
%x | Zadziesiątkowodzielny znak | 0123456789ABCDEF |
%z | Przerwa ( \0 ) |
Dla pojedynczych znaków charakteru, takich jak %a i %s, odpowiednią literą górnej części jest znak „|”. Na instancja, %p reprezentuje znak zapisu przecinku, a 1> %P1> reprezentuje wszystkie znaki, z wyjątkiem zapisu przecinku.
Znaki magiczne
Są 12 "magicznych znaków" które są zarezerwowane dla celów specjalnych w wzorcach:
$ | % | ^) | * | () | ) |
. | [: | ] | + | -: | ? |
Możesz uciec i szukać magicznych znaków używając symbolu %. Na przykład, aby szukać roblox.com, uciekaj z . (okres) symbolu poprzez przedrostkę 2> %2> .
-- „roblox.com” pasuje do „roblox#com”, ponieważ okres jest interpretowany jako „dowolny postać”local match1 = string.match("What is roblox#com?", "roblox.com")print(match1) --> roblox#com-- Ucieczka z okresu z % aby zostać zeskanowanym jako znak literackilocal match2 = string.match("I love roblox.com!", "roblox%.com")print(match2) --> roblox.com
Zakorowania
Możesz szukać wzoru na początku lub na końcu ciągu, używając symboli ^ i $.
local start1 = string.match("first second third", "^first") -- Ma치, ponieważ "pierwszy" jest na początkuprint(start1) --> pierwszylocal start2 = string.match("third second first", "^first") -- Nie pasuje, ponieważ "pierwszy" nie jest na początkuprint(start2) --> zerolocal end1 = string.match("first second third", "third$") -- Ma치, 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 $ , aby upewnić się, że wzór pasuje tylko do całej wartości, a nie tylko do niektórej części.
-- Używanie zarówno ^, jak i $ do dopasowania w całej ciąglocal match1 = string.match("Roblox", "^Roblox$") -- Zgadza się, ponieważ "Roblox" to cała stringa (równość)print(match1) --> Robloxlocal match2 = string.match("I play Roblox", "^Roblox$") -- Nie pasuje, ponieważ "Roblox" nie jest na początku I kończyćprint(match2) --> zerolocal match3 = string.match("I play Roblox", "Roblox") -- Zgadza się, ponieważ "Roblox" jest zawarty w "I play Roblox"print(match3) --> Roblox
Modyfikatory klasy
Sama w sobie klasa znaku charakteru tylko pasuje do jednego znaku charakteru w ciągu. Na instancjaponiższy wzór ( >%d "2" ) zaczyna czytać całą cześć z lewej do prawej strony, znajduje pierwszy znak ( "%d" ) i kończy.
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match) --> 2
Możesz użyć modyfikatorów z dowolną klasą postaci, aby kontrolować wynik:
Ilość | Znaczenie |
---|---|
+ | Zgadza się 1 lub więcej z wcześniejszej klasy znaku |
-: | Zgaduj, ile z wcześniejszych klas postaci |
* | Zgaduj 0 lub więcej z poprzednich klas postaci |
? | Zgadza się 1 lub mniej z poprzednim klasą znaku |
%n | For n between 1 and 9, match a substring equal to the 1>n1> th captured ciąg. |
%bxy | Zrównoważonej captury dopasującej x, y i wszystkiego pomiędzy (na przykład, %b() dopasuje pary nawiasów i wszystko pomiędzy nimi) |
Dodanie modyfikatora do tego samego wzoru ( "%d+" zamiast "%d" ) wygibt wynik 25 zamiast 1> 21> :
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
Ustawienia należy używać, gdy pojedyncza klasa znaku może nie zrobić całej pracy. Na instancjamożesz chcieć dopasować obie małe litery ( %l ) i znaki przerwy ( 0> %p 0> ) używając jednego wzoru.
Zestawy są zdefiniowane przez nawiasy [] wokół nich. W następnym przykładzie zauważaj różnicę między użyciem zestawu ( "[%l%p]+" ) i nie użyciem zestawu ( " ).
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- Ustawićprint(match1) --> cześć!!!local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- Niezdefiniowanyprint(match2) --> o!!!
Pierwszy komend (ustawiać) mówi Luau, aby znaleźć zarówno znaki nieduże, jak i znaki interpunktji. Z wskaźnikiem + dodanym po całym ustawiaćznajduje wszystko z tych znaków ( ello!!! ). Gdy dotyka przestrzeni, zatrzymuje się.
W drugim przykazaniu (niezdefiniowanym) kalkulator + stosuje się tylko do klasy %p przed nim, więc Luau grabi tylko pierwszy znak nieduży o przed serią przecinków ( 2> !!!2> ).
Podobnie jak klasy postaci, można ustawić, że ^ klasy mogą być "przeciwieństwami" siebie. To jest zrobione poprzez dodanie [ znaku postaci na początku ustawiać, bezpośrednio po otwarciu "[%p%s]+" . Na instancja, 2> "[
Ustawienia wspierają również zakresy, które pozwalają znaleźć cały zakres meczów między początkowym i końcowym postacią. Jest to zaawansowana funkcja, która jest opisana bardziej szczegółowo w Manual Lua 5.1.
Zdrapywanie znaków
String captures są pod Pattern. Te są zamknięte w nawiasach () i są używane do uzyskania (przechwytywać) dopasujących substringów i zapisu ich na zmienne. Na przykład poniższy wzór zawiera dwa captures, (%a+) i 1> percentd+1>, które zwracają dwa substringi po udanym
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) --> Dwóch tysiące 2000local key3, val3 = string.match("OneMillion=1000000", pattern)print(key3, val3) --> OneMillion 1000000
W poprzednim wzorcu kalkulator ? %s obejmujący obie %s klasy, jest bezpieczną dodatką, ponieważ tworzy przestrzeń na obu stronach znaku =. Oznacza to, że match zakończy się, jeśli jedna (lub obie) przestrzenie są niedostępne wokół znaku równości.
Kaptyury stron można również nestować jako następujący 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 niebioskie--> Królestwo chmur--> Królestwo Leśne jest pokojne--> Forest Kingdom
Ta wyszukiwarka wzorów działa następująco:
Library.string.gmatch()Library.string.gmatch() szuka dopasu na całym wzorem opisu zdefiniowanym przez zewnętrzną parę nawiasów. To zatrzymuje się na pierwszym komencie i kryje obserwuje:
# | Wzór | Zdobądź |
---|---|---|
1: | (The%s/%a+%sKingdom) [%w%s+] | Królestwo Chmur jest niebioskie |
Korzystając z jego udanego pierwszego przechwytywać, wtedy generator szuka dopasu na wzór królestwa zdefiniowany przez wewnętrzną parę nawiasów. Ten następujący wzór jest po prostu capturesz obserwuje:
# | Wzór | Zdobądź |
---|---|---|
2) | %a+%sKrólestwo) | Królestwo chmur |
iterator wtedy się wyłącza i nadal szuka całej ciąg, zachwycając obserwuje:
# | Wzór | Zdobądź |
---|---|---|
3) | (The%s/%a+%sKingdom) [%w%s+] | Królestwo Leśne jest pokojne |
4) | %a+%sKrólestwo) | Królestwo Lasu |
Oprócz wszystkich powyższych, istnieje specjalny przypadek z pustą capturą (()). Jeśli captura jest pusta, to pozycja w linii będzie capturowana:
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 chwyty mogą być gniażdżone 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--> Chmura 10--> Forest 42
Zwracane wartości są niezwykłe, ponieważ są liczbami a nie stringami:
local match = "This is an example"local pattern = "This is an ()example"local position = string.match(match, pattern)print(typeof(position)) --> number