Lua-Zeichenketten

Eine Zeichenkette ist eine Folge von Zeichen, die aus Ziffern, Buchstaben und Unterstrichen besteht.

In Lua sind Zeichenketten ein grundlegender Datentyp, der zum Speichern von Textdaten verwendet wird.

Zeichenketten in Lua können beliebige Zeichen enthalten, darunter Buchstaben, Ziffern, Symbole, Leerzeichen und andere Sonderzeichen.

In Lua können Zeichenketten auf die folgenden drei Arten ausgedrückt werden:

  • Eine Folge von Zeichen zwischen einfachen Anführungszeichen.

    local str1 = 'This is a string.'
    local str2 = "This is also a string."
  • Eine Folge von Zeichen zwischen doppelten Anführungszeichen.

    local str = "Hello, "
    str = str .. "World!"  -- 创建一个新的字符串并将其赋值给str
    print(str)  -- 输出 "Hello, World!"
  • [[und]]Eine Folge von Zeichen zwischen [[ und ]].

    local multilineString = [[
    This is a multiline string.
    It can contain multiple lines of text.
    No need for escape characters.
    ]]
    
    print(multilineString)

Beispiele für Zeichenketten unter Verwendung der oben genannten drei Arten sind wie folgt:

Beispiel

string1 = "Lua"
print("\"String 1 ist\"",string1)
string2 = 'example.com'
print("String 2 ist",string2)

string3 = [[Lua Tutorial]]
print("String 3 ist",string3)

Die Ausgabe der obigen Codeausführung ist:

"字符串 1 是"    Lua
字符串 2 是    example.com
字符串 3 是    "Lua 教程"

Berechnung der Zeichenkettenlänge

In Lua können Sie zum Berechnen der Länge einer Zeichenkette (d. h. der Anzahl der Zeichen in der Zeichenkette) diestring.len-Funktion oder dieutf8.len-Funktion verwenden, und für Zeichenketten, die chinesische Zeichen enthalten, verwenden Sie im Allgemeinenutf8.len,string.lenDie Funktion wird verwendet, um die Länge von Zeichenketten zu berechnen, die nur ASCII-Zeichen enthalten.

Beispiel

local myString = "Hello, EXAMPLE!"

-- Berechne die Länge der Zeichenkette (Anzahl der Zeichen)
local length = string.len(myString)

print(length) -- Ausgabe 14

Im obigen Beispiel enthält die Zeichenkette myString nur ASCII-Zeichen, daher kann die Funktionstring.lendie Länge der Zeichenkette genau zurückgeben.

Für Zeichenketten, die chinesische Zeichen enthalten, verwenden Sie die Funktionutf8.len:

Beispiel

local myString = "Hello, world!"

-- Berechne die Länge der Zeichenkette (Anzahl der Zeichen)
local length1 = utf8.len(myString)
print(length1) -- Ausgabe 10

-- Die Funktion string.len führt zu ungenauen Ergebnissen
local length2 = string.len(myString)
print(length2) -- Ausgabe 14

Das Ausgabeergebnis ist:

10
14

Escape-Zeichen werden verwendet, um Zeichen darzustellen, die nicht direkt angezeigt werden können, wie z. B. die Rücktaste, der Wagenrücklauf usw. Um beispielsweise doppelte Anführungszeichen in eine Zeichenkette aufzunehmen, können Sie\。

Alle Escape-Zeichen und ihre entsprechenden Bedeutungen:

Escape-Zeichen
Bedeutung
ASCII-Wert (dezimal)
\a
Glocke (BEL)
007
\b
Rücktaste (BS), verschiebt die aktuelle Position zur vorherigen Spalte
008
\f
Seitenvorschub (FF), verschiebt die aktuelle Position an den Anfang der nächsten Seite
012
\n
Zeilenvorschub (LF), verschiebt die aktuelle Position an den Anfang der nächsten Zeile
010
\r
Wagenrücklauf (CR), verschiebt die aktuelle Position an den Anfang der aktuellen Zeile
013
\t
Horizontaler Tabulator (HT) (springt zur nächsten TAB-Position)
009
\v
Vertikaler Tabulator (VT)
011
\\
Stellt ein Backslash-Zeichen '\\' dar
092
\'
Stellt ein einfaches Anführungszeichen (Apostroph) dar
039
\"
Stellt ein doppeltes Anführungszeichen dar
034
\0
Nullzeichen (NULL)
000
\ddd
Jedes Zeichen, das durch eine 1- bis 3-stellige Oktalzahl dargestellt wird
Dreistellige Oktalzahl
\xhh
Jedes Zeichen, das durch eine 1- bis 2-stellige Hexadezimalzahl dargestellt wird
Zweistellige Hexadezimalzahl

String-Operationen

Lua bietet viele Methoden zur Unterstützung von String-Operationen:

Laufende NummerMethode & Zweck
1string.upper(argument):
Wandelt die gesamte Zeichenkette in Großbuchstaben um.
2string.lower(argument):
Wandelt die gesamte Zeichenkette in Kleinbuchstaben um.
3string.gsub(mainString,findString,replaceString,num)

Innerhalb einer Zeichenkette ersetzen.

mainString ist der String, auf dem operiert wird, findString ist das zu ersetzende Zeichen, replaceString ist das Ersatzzeichen, num ist die Anzahl der Ersetzungen (kann ignoriert werden, dann werden alle ersetzt), zum Beispiel:
> string.gsub("aaaa","a","z",3);
zzza    3
4string.find (str, substr, [init, [plain]])

In einer angegebenen Zielzeichenkette str wird nach dem angegebenen Inhalt substr gesucht. Wenn eine übereinstimmende Teilzeichenkette gefunden wird, werden die Start- und Endindizes der Teilzeichenkette zurückgegeben; falls sie nicht existiert, wird nil zurückgegeben.

initGibt die Startposition der Suche an, standardmäßig 1. Sie kann eine negative Zahl sein und gibt dann die Anzahl der vom Ende an gezählten Zeichen an.

plainGibt an, ob der Plain-Modus verwendet werden soll, standardmäßig false. true führt nur eine einfache Teilstringsuche durch, false bedeutet die Verwendung von Musterabgleich mit regulären Ausdrücken.

Das folgende Beispiel findet die Start- und Endindexpositionen der Zeichenkette "Lua":

> string.find("Hello Lua user", "Lua", 1) 
7    9
5string.reverse(arg)
Stringumkehrung
> string.reverse("Lua")
auL
6string.format(...)
Gibt eine formatierte Zeichenkette ähnlich wie printf zurück
> string.format("the value is:%d",4)
the value is:4
7string.char(arg) und string.byte(arg[,int])
char wandelt Ganzzahlen in Zeichen um und verkettet sie, byte wandelt Zeichen in Ganzzahlwerte um (es kann ein bestimmtes Zeichen angegeben werden, standardmäßig das erste Zeichen).
> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
>
8string.len(arg)
Berechnet die Länge einer Zeichenkette.
string.len("abc")
3
9string.rep(string, n)
Gibt n Kopien der Zeichenkette zurück
> string.rep("abcd",2)
abcdabcd
10..
Verkettet zwei Zeichenketten
> print("www.example.".."com")
www.example.com
11string.gmatch(str, pattern)
Gibt eine Iteratorfunktion zurück. Jedes Mal, wenn diese Funktion aufgerufen wird, gibt sie den nächsten Teilstring zurück, der in der Zeichenkette str gefunden wird und der Musterbeschreibung entspricht. Wenn die durch den Parameter pattern beschriebene Zeichenkette nicht gefunden wird, gibt die Iteratorfunktion nil zurück.
> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
12string.match(str, pattern, init)
string.match() sucht nur die erste Übereinstimmung in der Quellzeichenkette str. Der Parameter init ist optional und gibt den Startpunkt des Suchvorgangs an; standardmäßig ist er 1.
Bei einer erfolgreichen Übereinstimmung gibt die Funktion alle Capture-Ergebnisse im übereinstimmenden Ausdruck zurück; wenn keine Capture-Marker gesetzt sind, gibt sie die gesamte übereinstimmende Zeichenkette zurück. Wenn es keine erfolgreiche Übereinstimmung gibt, gibt sie nil zurück.
> = string.match("I have 2 questions for you.", "%d+ %a+")
2 questions

> = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
2, "questions"

Teilzeichenkette

Zur Zeichenkettenextraktion wird die Methode sub() verwendet.

string.sub() wird verwendet, um eine Teilzeichenkette zu extrahieren. Der Prototyp ist:

string.sub(s, i [, j])

Parameter description:

  • s: die Zeichenkette, aus der extrahiert wird.
  • i: die Startposition für die Extraktion.
  • j: die Endposition für die Extraktion, standardmäßig -1, das letzte Zeichen.

Beispiel


-- Zeichenkette
local sourcestr = "prefix--examplegoogletaobao--suffix"
print("\nUrsprüngliche Zeichenkette ", string.format("%q", sourcestr))

-- Teil extrahieren, vom 4. bis zum 15.
local first_sub = string.sub(sourcestr, 4, 15)
print("\nErste Extraktion ", string.format("%q", first_sub))

-- Präfix der Zeichenkette nehmen, vom 1. bis zum 8.
local second_sub = string.sub(sourcestr, 1, 8)
print("\nZweite Extraktion ", string.format("%q", second_sub))

-- Die letzten 10 Zeichen extrahieren
local third_sub = string.sub(sourcestr, -10)
print("\nDritte Extraktion ", string.format("%q", third_sub))

-- Index außerhalb des Bereichs, ursprüngliche Zeichenkette ausgeben
local fourth_sub = string.sub(sourcestr, -100)
print("\nVierte Extraktion ", string.format("%q", fourth_sub))

Die Ausgabe der obigen Codeausführung ist:

原始字符串    "prefix--examplegoogletaobao--suffix"

第一次截取    "fix--exampleg"

第二次截取    "prefix--"

第三次截取    "ao--suffix"

第四次截取    "prefix--examplegoogletaobao--suffix"

Umwandlung der Groß-/Kleinschreibung von Zeichenketten

Das folgende Beispiel zeigt, wie man die Groß-/Kleinschreibung von Zeichenketten umwandelt:

Beispiel

string1 = "Lua";
print(string.upper(string1))
print(string.lower(string1))

Die Ausgabe der obigen Codeausführung ist:

LUA
lua

Zeichenketten-Suche und -Umkehrung

Das folgende Beispiel zeigt, wie Such- und Umkehroperationen auf Zeichenketten durchgeführt werden:

Beispiel

string = "Lua Tutorial"
-- Suche nach string
print(string.find(string,"Tutorial"))
reversedString = string.reverse(string)
print("Der neue String ist",reversedString)

Die Ausgabe der obigen Codeausführung ist:

5    12
新字符串为    lairotuT auL

String-Formatierung

Lua bietetstring.format()eine Funktion zum Erzeugen von Strings mit einem bestimmten Format. Der erste Parameter der Funktion ist das Format, gefolgt von verschiedenen Daten, die jeweils einem Code im Format entsprechen.

Durch die Existenz des Format-Strings wird die Lesbarkeit der resultierenden langen Strings erheblich verbessert. Das Format dieser Funktion ist dem von printf() in C sehr ähnlich.

Das folgende Beispiel zeigt, wie Formatierungsoperationen an Strings durchgeführt werden:

Der Format-String kann die folgenden Escape-Codes enthalten:

  • %c - akzeptiert eine Zahl und wandelt sie in das entsprechende Zeichen in der ASCII-Tabelle um
  • %d, %i - akzeptieren eine Zahl und wandeln sie in ein vorzeichenbehaftetes Ganzzahlformat um
  • %o - akzeptiert eine Zahl und wandelt sie in ein Oktalformat um
  • %u - akzeptiert eine Zahl und wandelt sie in ein vorzeichenloses Ganzzahlformat um
  • %x - akzeptiert eine Zahl und wandelt sie in ein Hexadezimalformat um, wobei Kleinbuchstaben verwendet werden
  • %X - akzeptiert eine Zahl und wandelt sie in ein Hexadezimalformat um, wobei Großbuchstaben verwendet werden
  • %e - akzeptiert eine Zahl und wandelt sie in das Format der wissenschaftlichen Notation um, wobei ein kleines e verwendet wird
  • %E - akzeptiert eine Zahl und wandelt sie in das Format der wissenschaftlichen Notation um, wobei ein großes E verwendet wird
  • %f - akzeptiert eine Zahl und wandelt sie in ein Gleitkommaformat um
  • %g(%G) - akzeptiert eine Zahl und wandelt sie in das kürzere Format von %e (%E, entsprechend %G) und %f um
  • %q - akzeptiert eine Zeichenkette und wandelt sie in ein Format um, das vom Lua-Compiler sicher gelesen werden kann
  • %s - akzeptiert eine Zeichenkette und formatiert sie entsprechend den angegebenen Parametern.

Um das Format weiter zu verfeinern, können nach dem %-Zeichen Parameter hinzugefügt werden. Die Parameter werden in der folgenden Reihenfolge gelesen:

  • (1) Vorzeichen: Ein +-Zeichen gibt an, dass die folgende numerische Escape-Sequenz bewirkt, dass positive Zahlen ein positives Vorzeichen anzeigen. Standardmäßig zeigen nur negative Zahlen ein Vorzeichen.
  • (2) Platzhalter: Eine 0, die zum Auffüllen verwendet wird, wenn danach eine String-Breite angegeben wird. Wenn er nicht angegeben wird, ist der Standard-Platzhalter ein Leerzeichen.
  • (3) Ausrichtungsflag: Wenn eine String-Breite angegeben wird, ist die Standardausrichtung rechtsbündig; durch Hinzufügen eines -Zeichens wird sie linksbündig.
  • (4) Breitenwert
  • (5) Dezimalstellen / String-Kürzung: Der nach dem Breitenwert angegebene Bruchteil n. Wenn f folgt (Gleitkomma-Escape, z. B. %6.3f), legt er fest, dass der Float nur n Dezimalstellen behält; wenn s folgt (String-Escape, z. B. %5.3s), legt er fest, dass der String nur die ersten n Zeichen anzeigt.

Beispiel

string1 = "Lua"
string2 = "Tutorial"
number1 = 10
number2 = 20
-- Grundlegende String-Formatierung
print(string.format("Grundlegende Formatierung %s %s",string1,string2))
-- Datumsformatierung
date = 2; month = 1; year = 2014
print(string.format("Datumsformatierung %02d/%02d/%04d", date, Monat, Jahr))
-- Dezimalformatierung
print(string.format("%.4f",1/3))

Das Ergebnis der Ausführung des obigen Codes ist:

基本格式化 Lua Tutorial
日期格式化 02/01/2014
0.3333

Weitere Beispiele:

Beispiel

string.format("%c", 83)                 -- Ausgabe S
string.format("%+d", 17.0)              -- Ausgabe +17
string.format("%05d", 17)               -- Ausgabe 00017
string.format("%o", 17)                 -- Ausgabe 21
string.format("%u", 3.14)               -- Ausgabe 3
string.format("%x", 13)                 -- Ausgabe d
string.format("%X", 13)                 -- Ausgabe D
string.format("%e", 1000)               -- Ausgabe 1.000000e+03
string.format("%E", 1000)               -- Ausgabe 1.000000E+03
string.format("%6.3f", 13)              -- Ausgabe 13.000
string.format("%q", "One\nTwo")         -- Ausgabe "One\
                                        --   Two"
string.format("%s", "monkey")           -- Ausgabe monkey
string.format("%10s", "monkey")         -- Ausgabe monkey
string.format("%5.3s", "monkey")        -- Ausgabe mon

Zeichen- und Ganzzahlkonvertierung

Das folgende Beispiel zeigt die Konvertierung zwischen Zeichen und Ganzzahlen:

Beispiel

-- Zeichenkonvertierung
-- Erstes Zeichen konvertieren
print(string.byte("Lua"))
-- Konvertiere das dritte Zeichen
print(string.byte("Lua",3))
-- Konvertiere das letzte Zeichen
print(string.byte("Lua",-1))
-- Das zweite Zeichen
print(string.byte("Lua",2))
-- Konvertiere das vorletzte Zeichen
print(string.byte("Lua",-2))

-- Konvertiere einen ganzzahligen ASCII-Code in ein Zeichen
print(string.char(97))

Das Ergebnis der Ausführung des obigen Codes ist:

76
97
97
117
117
a

Weitere gängige Funktionen

Das folgende Beispiel demonstriert weitere String-Operationen, wie die Berechnung der Stringlänge, String-Verkettung, String-Wiederholung usw.:

Beispiel

string1 = "www."
string2 = "example"
string3 = ".com"
-- Verwende .. zur String-Verkettung
print("Concatenated string",string1..string2..string3)

-- String-Länge
print("String length ",string.len(string2))

-- Die Zeichenkette 2-mal kopieren
repeatedString = string.rep(string2,2)
print(repeatedString)

Das Ergebnis der Ausführung des obigen Codes ist:

连接字符串    www.example.com
字符串长度     6
exampleexample

Musterabgleich

Übereinstimmungsmuster in Lua werden direkt mit gewöhnlichen Zeichenketten beschrieben. Sie werden in Musterabgleichsfunktionen verwendetstring.find, string.gmatch, string.gsub, string.match。

Sie können auch Zeichenklassen in Musterzeichenketten verwenden.

Eine Zeichenklasse ist ein Musterelement, das auf ein beliebiges Zeichen aus einer bestimmten Zeichenmenge passt. Zum Beispiel stimmt die Zeichenklasse%dmit jeder Ziffer überein. Sie können also die Musterzeichenkette%d%d/%d%d/%d%d%d%dzum Suchen verwendendd/mm/yyyyDatumsangaben im Format:

Beispiel

s = "Die Frist ist der 30/05/1999, verbindlich"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date)))    --> 30/05/1999

Die folgende Tabelle listet alle von Lua unterstützten Zeichenklassen auf:

Ein einzelnes Zeichen (außer^$()%.[]*+-?): entspricht dem Zeichen selbst

  • . (Punkt): entspricht einem beliebigen Zeichen
  • %a: entspricht einem beliebigen Buchstaben
  • %c: entspricht einem beliebigen Steuerzeichen (z. B. \n)
  • %d: entspricht einer beliebigen Ziffer
  • %l: entspricht einem beliebigen Kleinbuchstaben
  • %p: entspricht einem beliebigen Satzzeichen
  • %s: entspricht einem beliebigen Leerraumzeichen
  • %u: entspricht einem beliebigen Großbuchstaben
  • %w: entspricht jedem alphanumerischen Zeichen
  • %x: entspricht jeder hexadezimalen Ziffer
  • %z: entspricht jedem Zeichen, das 0 darstellt
  • %x (wobei x ein nicht alphanumerisches Zeichen ist): entspricht dem Zeichen x. Wird hauptsächlich verwendet, um den Abgleich von Zeichen mit speziellen Funktionen in Ausdrücken (^$()%.[]*+-?) zu behandeln, z. B. entspricht %% dem Zeichen %
  • [mehrere Zeichenklassen]: entspricht jedem Zeichen aus den in [] enthaltenen Zeichenklassen. Zum Beispiel entspricht [%w_] jedem Buchstaben oder einer Ziffer oder dem Unterstrichsymbol (_)
  • [^mehrere Zeichenklassen]: entspricht jedem Zeichen, das nicht in den in [] enthaltenen Zeichenklassen vorkommt. Zum Beispiel entspricht [^%s] jedem Nicht-Leerraum-Zeichen

Wenn die oben genannten Zeichenklassen in Großbuchstaben geschrieben werden, entsprechen sie jedem Zeichen, das nicht in dieser Zeichenklasse enthalten ist. Zum Beispiel entspricht %S jedem Nicht-Leerraum-Zeichen. Zum Beispiel entspricht '%A' Nicht-Buchstaben-Zeichen:

> print(string.gsub("hello, up-down!", "%A", "."))
hello..up.down.    4

Die Zahl 4 ist nicht Teil des Zeichenketten-Ergebnisses; sie ist das zweite von gsub zurückgegebene Ergebnis und repräsentiert die Anzahl der vorgenommenen Ersetzungen.

Beim Musterabgleich gibt es einige Sonderzeichen mit besonderer Bedeutung. Die Sonderzeichen in Lua sind wie folgt:

( ) . % + - * ? [ ^ $

'%' wird als Escape-Zeichen für Sonderzeichen verwendet, daher entspricht '%.' einem Punkt; '%%' entspricht dem Zeichen '%'. Das Escape-Zeichen '%' kann nicht nur zum Escapen von Sonderzeichen verwendet werden, sondern auch für alle nicht alphabetischen Zeichen.

Muster-Elemente können sein:

  • Eine einzelne Zeichenklasse entspricht jedem einzelnen Zeichen in dieser Klasse;
  • Eine einzelne Zeichenklasse gefolgt von einem '*', entspricht null oder mehr Zeichen dieser Klasse. Dieser Eintrag entspricht immer der längstmöglichen Zeichenkette;
  • Eine einzelne Zeichenklasse gefolgt von einem '+', entspricht einem oder mehreren Zeichen dieser Klasse. Dieser Eintrag entspricht immer der längstmöglichen Zeichenkette;
  • Eine einzelne Zeichenklasse gefolgt von einem '-', entspricht null oder mehr Zeichen dieser Klasse. Im Gegensatz zu '*', dieser Eintrag entspricht immer der kürzestmöglichen Zeichenkette;
  • Eine einzelne Zeichenklasse gefolgt von einem '?', entspricht null oder einem Zeichen dieser Klasse. Wenn möglich, entspricht er einem;
  • %n, wobeinvon 1 bis 9 sein kann; dieser Eintrag stimmt mit einem Teilstring überein, der gleich dernnummerierten Erfassung ist (unten beschrieben).
  • %bxy, wobeixundyzwei explizite Zeichen sind; dieser Eintrag stimmt mit einer Zeichenkette überein, die mitxbeginnt und mityendet, und in derxundybleibtausgeglicheneZeichenkette.xJust+1Dies bedeutet, wenn Sie diese Zeichenkette von links nach rechts lesen, für jedes Mal, wenn Sie einyJust lesen-1, und lies einy,ydas am endgültigen Ende%b().
  • %f[set]kann eine Eingabe mit ausbalancierten Klammern abgleichen., bezieht sich auf ⟦⟧Frontier-Muster⟦⟧⟦⟧Menge⟦⟧Dieser Eintrag stimmt mit einer leeren Zeichenkette überein.frontier patternset; this entry matches an empty string locatedMengeein Zeichen in [set],Menge.\0hat die gleiche Bedeutung wie bereits beschrieben.

' als ob.

Muster:Muster^bezieht sich auf eine Folge von Musterelementen.$' verankert die Übereinstimmung am Anfang der Zeichenkette.^' verankert den Abgleichvorgang am Ende der Zeichenkette.$' und '

' an anderen Positionen auftreten, haben sie keine besondere Bedeutung und stehen für sich selbst.

Erfassungen:Ein Muster kann ein Untermuster mit Klammern einschließen;Erfassungen.Erfassungen"(a*(.)%w(%s*))"Die Teilzeichenketten in der übereinstimmenden Zeichenkette werden für die spätere Verwendung gespeichert."a*(.)%w(%s*)",.der Teil wird in der ersten Erfassung gespeichert%s*das übereinstimmende Zeichen ist Erfassung 2,

Der übereinstimmende Teil ist Erfassung 3.()Als Sonderfall: eine leere Erfassung"()aa()"erfasst die aktuelle Position in der Zeichenkette (die eine Zahl ist)."flaaap"auf die Zeichenkette angewendet

, erzeugt sie zwei Erfassungen: