Der Schnurdatentyp ist eine Sequenz von Zeichen, wie Buchstaben, Zahlen und Symbole.Es ist der Datentyp für das Speichern der meisten textbasierten Informationen.
Erkläre Zeichenketten
Um eine Zeichenvariable zu deklarieren, stelle Zitate um die Zeichen herum bereit.Es ist üblicher, doppelte Anführungszeichen zu verwenden ( " ), aber auch einzelne Anführungszeichen ( ' ) funktionieren.Wenn du einen einzelnen oder doppelten Anführungsstrich in deiner Stringeinfügen möchtest, wickle deine Zeichenkette um den anderen Anführungsstrich herum oder verwende einen entkommenen Anführungsstrich.
local string1 = "Hello world!"print(string1) --> Hallo Welt!local string2 = 'Hello "world"!'print(string2) --> Hello "world"!
Um sowohl einzelne als auch doppelte Anführungszeichen in einer Stringeinzuschließen oder mehrzeilige Zeichenketten zu erstellen, erkläre sie mit doppelten Klammern:
local string1 = [[Helloworld!Hello "world"!Hello 'world'!]]print(string1)--> Hallo--> welt!--> Hallo "Welt"!--> Hello 'world'!
Wenn nötig, können Sie mehrere Klammern in einer Zeichenkette verschachteln, indem Sie die gleiche Anzahl gleichartiger Zeichen sowohl in der Anfangs- als auch in der Endklammer verwenden:
local string1 = [=[Hello[[world!]]]=]print(string1)--> Hallo--> [[world!]]
Zeichenketten kombinieren
Um Zeichenfolgen zu kombinieren, verbinden sie mit zwei Punkten ( .. ).Das Verketten von Zeichenketten fügt keine Leerstelle zwischen ihnen ein, du musst also am Ende/Anfang einer vorherigen/folgenden Stringeinen (oder mehrere) Platzeinfügen oder eine Leerstelle zwischen den beiden Zeichenketten kombinieren.
local hello = "Hello"local helloWithSpace = "Hello "local world = "world!"local string1 = hello .. worldlocal string2 = helloWithSpace .. worldlocal string3 = hello .. " " .. worldprint(string1) --> Hallowelt!print(string2) --> Hallo Welt!print(string3) --> Hello world!
Beachten Sie, dass die print() Befehl mehrere Argumente verwendet und sie mit ] Leerstellen kombiniert, so dass Sie , anstelle von .. verwenden können, um Leerstellen in print() Ausgaben zu erhalten.
local hello = "Hello"local world = "world"local exclamationMark = "!"print(hello .. world .. exclamationMark) --> Hallowelt!print(hello, world .. exclamationMark) --> Hallo Welt!print(hello, world, exclamationMark) --> Hello world !
Zeichenfolgen konvertieren
Um einen String in eine Zahl umzuwandeln, verwende die tonumber() Funktion. Wenn der String keine Zahlendarstellung hat, gibt tonumber() zurück nil.
local numericString = "123"print(tonumber(numericString)) --> 123local alphanumericString = "Hello123"print(tonumber(alphanumericString)) --> nil
Entkommende Zeichenketten
Um einer doppelten oder einfachen Anführungszeichen-Erklärung zu entkommen und fast jeden Zeichen einzubetten, setze einen Rücktaste ( \ ) vor dem Zeichen.Zum Beispiel:
- Um eine einzige Zitation in einen einzigen Stringeinzufügen, verwende \'.
- Um ein doppeltes Zitat in einen doppelten Stringeinzufügen, verwende \".
local string1 = 'Hello \'world\'!'print(string1) --> Hallo 'Welt'!local string2 = "Hello \"world\"!"print(string2) --> Hello "world"!
Bestimmte Zeichen, die nach Rücktasten folgen, produzieren spezielle Zeichen anstelle von entkommenen Zeichen:
- Um eine neue Zeile einzufügen, verwende \n.
- Um eine horizontale Registerkarte einzufügen, verwende \t.
local string1 = "Hello\nworld!"print(string1)--> Hallo--> welt!local string2 = "Hello\tworld!"print(string2) --> Hello world!
Interpolation
Luau unterstützt Schnurinterpolation , eine Funktion, mit der du Ausdrücke in Zeichen einfügen kannst.Verwende Backticks ( ` ), um eine interpolierte Stringzu deklarieren, und füge dann Ausdrücke in geschweiften Klammern hinzu:
local world = "world"local string1 = `Hello {world}!`print(string1) --> Hello world!
Obwohl Variablen die häufigste Verwendung sind, kannst du jede Ausdruck verwenden, einschließlich Mathe:
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) --> Hallo Welt, 1 Mal!print(string2) --> Hallo Welt, 2 Mal!print(string3) --> Hello world a third time!
Standard-Fluchtbeschränkungen gelten für Backticks, kurze Klammern und Rückschläge:
local string1 = `Hello \`\{world\}\`!`print(string1) --> Hello `{world}`!
Mathematische Konvertierung
Wenn Sie mathematische Operationen an einem String durchführen, konvertiert Luau den String automatisch in eine Zahl.Wenn der String keine Zahlendarstellung hat, wird ein Fehler geworfen.
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
Vergleiche
Schnüre können mit den <, <=, > und >= Operatoren verglichen werden, die basierend auf der lexikalischen Reihenfolge der ASCII-Codes eines jeden Zeichens in einer Stringvergleichen.Dies führt dazu, dass Zahlen in Zeichen nicht richtig verglichen werden, zum Beispiel wird "100" weniger als "20" sein, da die Bytes "0" und "1" geringere ASCII-Codes haben als der Byte "2" .
print("Apple" < "apple") --> wahrprint("Banana" < "apple") --> true (B ist vor einem in ASCII)print("number100" < "number20") --> true
Schnurmustervorlage
Ein Zeichenmuster ist eine Kombination von Zeichen, die du mit string.match() , string.gmatch() und anderen Funktionen verwenden kannst, um ein Element oder einen Substring einer längeren Stringzu finden.
Direkte Übereinstimmungen
Du kannst direkte Übereinstimmungen in einer Luau-Funktion wie string.match() verwenden, mit Ausnahme von magischen Zeichen.Zum Beispiel suchen diese Befehle nach dem Wort Roblox innerhalb einer String:
local match1 = string.match("Welcome to Roblox!", "Roblox")local match2 = string.match("Welcome to my awesome game!", "Roblox")print(match1) -->Robloxprint(match2) --> nil
Klassen
Zeichenklassen sind für fortgeschrittene Zeichensuche unerlässlich.Du kannst sie verwenden, um nach etwas zu suchen, das nicht unbedingt charakterpezifisch ist, aber in eine bekannte Kategorie (Klasse) passt, einschließlich Buchstaben , Zahlen , Leerstellen , Punctuation und mehr.
Die folgende Tabelle zeigt die offiziellen Charakterklassen für Luau-Schnelltextmuster:
Klasse | Vertreibt | Beispiel-Match |
---|---|---|
. | Jeder Charakter | 32kasGJ1%fTlk?@94 |
%a | Ein Großbuchstabe oder ein Kleinschreibstabe | aBcDeFgHiJkLmNoPqRsTuVwXyZ |
%l | Ein kleiner Buchstabe | abcdefghijklmnopqrstuvwxyz |
%u | Ein Großbuchstabe | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
%d | Jede Zahl (Nummer) | 0123456789 |
%p | Jeder Punktzeichencharakter | !@#;,. |
%w | Ein alphanumerischer Zeichen (entweder ein Buchstabe oder eine Zahl) | abcdefghijklmnopqrsztuvwxyz0123456789 |
%s | Ein Leerzeichen- oder Leertzeichencharakter | , \n , und \r |
%c > | Ein spezieller Steuerzeichen | |
%x | Ein hexadezimaler Zeichen | 01234 |
%z | Der NULL-Zeichen ( \0 ) |
Für Klassen mit einzelnem Buchstabensymbol wie %a und %s repräsentiert der entsprechende Großbuchstabe das "Gegenteil" der Klasse.Zum Instanzrepräsentiert %p einen Zeichenpunkt, während %P alle Zeichen außer der Punktierung repräsentiert.
Magische Zeichen
Es gibt 12 "magische Zeichen", die für spezielle Zwecke in Mustern reserviert sind:
$ | % | ^ | * | ( | ) |
. | [ | ] | + | - | ? |
Du kannst entkommen und magische Zeichen suchen, indem du das %-Symbol verwendest.Zum Beispiel, um nach roblox.com zu suchen, entkomme dem . (Zeichen) -Symbol, indem du es mit einem % vorangibst, wie in %. .
-- die übereinstimmung "roblox.com" mit "roblox#com" liegt daran, dass die periode als "jede zeiche" interpretiert wirdlocal match1 = string.match("What is roblox#com?", "roblox.com")print(match1) --> roblox#com-- Entkomme der Periode mit %, damit sie als einfacher Periode-Zeichen interpretiert wirdlocal match2 = string.match("I love roblox.com!", "roblox%.com")print(match2) --> roblox.com
Anker
Du kannst nach einem Muster am Anfang oder am Ende einer Zeichenkette suchen, indem du die ^ und $ Symbole verwendest.
local start1 = string.match("first second third", "^first") -- Matches, weil "erst" am Anfang istprint(start1) --> zuerstlocal start2 = string.match("third second first", "^first") -- Passt nicht, weil "erst" nicht am Anfang istprint(start2) --> nulllocal end1 = string.match("first second third", "third$") -- Matches, weil "dritt" am beendenistprint(end1) --> drittelocal end2 = string.match("third second first", "third$") -- Passt nicht, weil "dritt" nicht am beendenistprint(end2) --> nil
Du kannst auch sowohl ^ als auch $ zusammen verwenden, um sicherzustellen, dass ein Muster nur die volle Zeichenfolge und nicht nur einen Teil davon übereinstimmt.
-- Verwendung von ^ und $, um über eine volle Stringhinweg zu passenlocal match1 = string.match("Roblox", "^Roblox$") -- Matches, weil "Roblox" die gesamte Zeichenkette ist (Gleichheit)print(match1) -->Robloxlocal match2 = string.match("I play Roblox", "^Roblox$") -- Passt nicht, weil "Roblox" nicht am Anfang UND am beendenistprint(match2) --> nulllocal match3 = string.match("I play Roblox", "Roblox") -- Matches, weil "Roblox" in "Ich spiele Roblox" enthalten istprint(match3) --> Roblox
Klassenmodifizierer
Allein eine Charakterklasse passt nur auf einen Zeichen in einer Stringzu.Zum Instanzbeginnt das folgende Muster ( "%d" ) mit dem Lesen des Strangs von links nach rechts, findet die erste Zahl ( 2 ), und hört auf.
local match = string.match("The Cloud Kingdom has 25 power gems", "%d")print(match) --> 2
Du kannst Modifizierer mit jeder Zeichenklasse verwenden, um das Ergebnis zu kontrollieren:
Quantifikator | Bedeutung |
---|---|
+ | Passen Sie 1 oder mehr der vorherigen Zeichenklasse an |
- | Passen Sie so wenig wie möglich der vorherigen Zeichenklasse gleich |
* | Passen Sie 0 oder mehr der vorherigen Zeichenklasse an |
? | Passen Sie 1 oder weniger der vorherigen Zeichenklasse an |
%n | Für n zwischen 1 und 9 entspricht ein Substring dem n aufgenommenen String. |
:%bxy | Die ausgeglichene Aufnahme, die übereinstimmt mit x , y , und alles dazwischen (zum Beispiel, %b() passt zu einer Reihe von Klammern und allem, was sich dazwischen befindet) |
Das Hinzufügen eines Modifiers zum gleichen Muster ( "%d+" statt "%d" ), gibt Ausgaben 25 statt 2 aus:
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
Klassensätze
Sets sollten verwendet werden, wenn eine einzige Zeichenklasse den gesamten Job nicht erledigen kann.Zum Instanzmöchten Sie vielleicht beide Großbuchstaben ( %l ) und Interpunktionszeichen ( %p ) mit einem einzigen Muster übereinstimmen lassen.
Sätze werden durch Klammern [] um sie herum definiert.Im folgenden Beispiel beachten Sie den Unterschied zwischen der Verwendung eines Sets ( "[%l%p]+" ) und nicht Verwendung eines Sets ( "%l%p+" ).
local match1 = string.match("Hello!!! I am another string.", "[%l%p]+") -- Festlegenprint(match1) --> hallo!!!local match2 = string.match("Hello!!! I am another string.", "%l%p+") -- Nicht festgelegtprint(match2) --> o!!!
Der erste Befehl (festlegen) sagt Luau, sowohl kleine Buchstaben als auch Punctuation zu finden.Mit dem Quantifikator +, der nach der gesamten festlegenhinzugefügt wurde, findet er alle dieser Zeichen ( ello!!! ), hört auf, wenn er den Platzerreicht.
Im zweiten Befehl (nicht festgelegt) gilt der + Quantifikator nur für die %p Klasse vorher, also greift Luau nur den ersten kleinbuchstabigen Zeichen ( o ) vor der Reihe der Interpunktionen ( !!! ).
Wie Klassenkönnen Sätze "Gegensätze" von sich selbst sein.Dies wird durch die Ergänzung eines ^ Zeichens am Beginn des festlegenerledigt, direkt nach der Öffnung [.Zum Instanzrepräsentiert "[%p%s]+" sowohl Interpunktionen als auch Leerstellen, während "[^%p%s]+" alle Zeichen außer Interpunktionen und Leerstellen repräsentiert.
Sätze unterstützen auch Bereiche , die es Ihnen ermöglichen, eine gesamte Reihe von Übereinstimmungen zwischen einem Start- und Endzeichen zu finden.Dies ist eine fortgeschrittene Funktion, die im Lua 5.1-Handbuch im Detail beschrieben ist.
Schnelltext-Aufnahmen
Schnur Einfang sind Untermuster innerhalb eines Musters.Diese werden in Klammern () geschlossen und werden verwendet, um passende Unterstriche zu erhalten und sie in Variablen zu speichern.Zum Beispiel enthält das folgende Muster zwei Captures, (%a+) und (%d+), die bei einem erfolgreichen übereinstimmenzwei Substrings zurückgeben.
local pattern = "(%a+)%s?=%s?(%d+)"local key1, val1 = string.match("TwentyOne = 21", pattern)print(key1, val1) --> Zweiundzwanzig 21local key2, val2 = string.match("TwoThousand= 2000", pattern)print(key2, val2) --> ZweiTausend 2000local key3, val3 = string.match("OneMillion=1000000", pattern)print(key3, val3) --> OneMillion 1000000
Im vorherigen Muster ist der ? Quantifikator, der beiden %s Klassen folgt, eine sichere Ergänzung, weil er den Raum auf der einen Seite des = Zeichens optional macht.Das bedeutet, dass das Spiel erfolgreich ist, wenn ein (oder beide) Räume um das gleichheitszeichen herum fehlen.
Schnelltext-Aufzeichnungen können auch verschachtelt sein, wie das folgende Beispiel:
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--> Das Cloud-Königreich ist himmlisch--> Wolkenreich--> Das Waldreich ist friedlich--> Forest Kingdom
Diese Muster-Suche funktioniert wie folgt:
Der string.gmatch() Iterator sucht nach einem Übereinstimmungsmuster auf der gesamten "Beschreibung"-Vorlage, die vom äußeren Paar von Klammern definiert wurde.Dies stoppt beim ersten Komma und erfasst gefolgte Profile:
# | Vorlage | Einfangen |
---|---|---|
1 | (Die%s(%a+%sKönigreich)[%w%s]+) | Das Cloud-Königreich ist himmlisch |
Mit seiner erfolgreichen ersten erfassensucht der Iterator dann nach einem Match auf dem "Königreich"-Muster, das vom inneren Paar von Klammern definiert wurde.Dieses verschachtelte Muster erfasst einfach gefolgte Profile:
# | Vorlage | Einfangen |
---|---|---|
2 | (%a+%sKönigreich) | Wolkenreich |
Der Iterator zieht sich dann zurück und sucht weiter die gesamte String, indem er gefolgte Profileeinfängt:
# | Vorlage | Einfangen |
---|---|---|
3 | (Die%s(%a+%sKönigreich)[%w%s]+) | Das Waldreich ist friedlich |
4 | (%a+%sKönigreich) | Wald Königreich |
Zusätzlich zu all dem oben Gesagten gibt es einen besonderen Fall mit einem leeren Fang ( () ).Wenn eine Aufnahme leer ist, wird die Position in der Zeile aufgenommen:
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
Diese speziellen Aufnahmen können wie normale aufgestapelt werden:
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--> Wolke 10--> Forest 42
Die zurückgegebenen Werte sind ungewöhnlich, da sie Zahlen sind, anstatt Zeichen:
local match = "This is an example"local pattern = "This is an ()example"local position = string.match(match, pattern)print(typeof(position)) --> number