Suche…


Syntax

  • string.find (str, pattern [, init [, plain]]) - Gibt den Start- und Endindex der Übereinstimmung in str zurück

  • string.match (str, pattern [, index]) - Gleicht ein Muster einmal ab (beginnend mit dem Index)

  • string.gmatch (str, pattern) - Gibt eine Funktion zurück, die alle Übereinstimmungen in str durchläuft

  • string.gsub (str, pattern, repl [, n]) - Ersetzt Teilzeichenfolgen (maximal n-mal)

  • . steht für alle Zeichen

  • %a für alle Buchstaben

  • %l für alle Kleinbuchstaben

  • %u für alle Großbuchstaben

  • %d für alle Ziffern

  • %x für alle Hexadezimalstellen

  • %s für alle Leerzeichen

  • %p für alle Satzzeichen

  • %g für alle druckbaren Zeichen außer Leerzeichen

  • %c für alle Steuerzeichen

  • [set] für die Klasse, die die Vereinigung aller Zeichen in Set darstellt.

  • [^set] repräsentiert das Komplement von set

  • * gierige Übereinstimmung 0 oder mehr Vorkommen der vorherigen Zeichenklasse

  • + greedy match 1 oder mehr Vorkommen der vorherigen Zeichenklasse

  • - Lazy Match 0 oder mehr Vorkommen der vorherigen Zeichenklasse

  • ? stimmt genau mit 0 oder 1 der vorherigen Zeichenklasse überein

Bemerkungen

In einigen Beispielen wird die Notation (<string literal>):function <string literal> verwendet, die der string.function(<string literal>, <string literal>) da für alle Strings eine Metable mit dem Feld __index festgelegt ist zu der string Tabelle.

Lua Musterabgleich

Anstatt Regex zu verwenden, enthält die Lua-String-Bibliothek einen speziellen Satz von Zeichen, der in Syntaxübereinstimmungen verwendet wird. Beide können sich sehr ähnlich sein, aber der Lua-Musterabgleich ist eingeschränkter und hat eine andere Syntax. Beispielsweise entspricht die Zeichenfolge %a beliebigen Buchstaben, während die Großbuchstabenversion alle Zeichen ohne Buchstaben darstellt . Alle Zeichenklassen (eine Zeichenfolge, die als Muster mit einer Gruppe von Elementen übereinstimmen kann) sind unten aufgeführt.

Zeichenklasse Passender Abschnitt
%ein Buchstaben (AZ, az)
% c Steuerzeichen (\ n, \ t, \ r, ...)
% d Ziffern (0-9)
% l Kleinbuchstabe (az)
% p Satzzeichen (!,?, &, ...)
% s Leerzeichen
% u Großbuchstaben
% w alphanumerische Zeichen (AZ, az, 0-9)
% x Hexadezimalziffern (\ 3, \ 4, ...)
% z das Zeichen mit der Darstellung 0
. Stimmt mit einem beliebigen Zeichen überein

Wie oben erwähnt, stellt jede Version dieser Klassen in Großbuchstaben das Komplement der Klasse dar. Zum Beispiel stimmt %D mit einer beliebigen Nicht-Ziffernfolge überein:

string.match("f123", "%D")          --> f

Zusätzlich zu den Zeichenklassen haben einige Zeichen spezielle Funktionen als Muster:

( ) % . + - * [ ? ^ $

Das Zeichen % für eine Zeichenflucht und macht %? Übereinstimmung mit einer Abfrage und %% mit dem Prozentzeichen. Sie können das % -Zeichen auch für andere nicht-alphanumerische Zeichen verwenden. Wenn Sie beispielsweise ein Zitat mit einem Escape-Zeichen versehen müssen, müssen Sie \\ vor diesem Zeichen verwenden, wodurch jedes Zeichen aus einem Lua-String entzogen wird.

Mit einem in eckigen Klammern ( [] ) dargestellten Zeichensatz können Sie eine spezielle Zeichenklasse erstellen, die verschiedene Klassen und Einzelzeichen kombiniert:

local foo = "bar123bar2341"
print(foo:match "[arb]")            --> b

Sie können das Komplement des Zeichensatzes erhalten, indem Sie es mit ^ :

local foo = "bar123bar2341"
print(string.match(foo, "[^bar]"))  --> 1

In diesem Beispiel findet string.match das erste Vorkommen, das nicht b , a oder r ist .

Muster können mithilfe von Wiederholungs- / optionalen Modifizierern nützlicher sein. Muster in Lua bieten die folgenden vier Zeichen:

Charakter Modifikator
+ Eine oder mehrere Wiederholungen
* Null oder mehr Wiederholungen
- Auch keine oder mehrere Wiederholungen
? Optional (null oder ein Vorkommen)

Das Zeichen + stellt ein oder mehrere übereinstimmende Zeichen in der Sequenz dar und gibt immer die längste übereinstimmende Sequenz zurück:

local foo = "12345678bar123"
print(foo:match "%d+")  --> 12345678

Wie Sie sehen, * ist ähnlich wie + , akzeptiert jedoch keine Vorkommen von Zeichen und wird normalerweise verwendet, um optionale Leerzeichen zwischen verschiedenen Mustern abzugleichen.

Das Zeichen - ist ebenfalls * ähnlich, aber anstatt die längste übereinstimmende Sequenz zurückzugeben, stimmt es mit der kürzesten überein.

Der Modifikator ? passt auf ein optionales Zeichen, sodass Sie beispielsweise eine negative Ziffer finden können:

local foo = "-20"
print(foo:match "[+-]?%d+")

Die Lua-Pattern-Matching-Engine bietet einige zusätzliche Pattern-Matching-Elemente:

Zeichenelement Beschreibung
%n für n zwischen 1 und 9 stimmt eine Teilzeichenfolge überein, die der n-ten erfassten Zeichenfolge entspricht
%bxy vergleicht die Teilzeichenfolge zwischen zwei verschiedenen Zeichen (ausgeglichenes Paar aus x und y )
%f[set] Grenzmuster: passt eine leere Zeichenfolge an einer beliebigen Position an, so dass das nächste Zeichen erscheint
gehört zur Gruppe und das vorherige Zeichen gehört nicht zur Gruppe

string.find (Einleitung)

Die find

Zuerst werfen wir einen Blick auf die Funktion string.find :

Die Funktion string.find (s, substr [, init [, plain]]) gibt den Start- und string.find (s, substr [, init [, plain]]) eines gefundenen Teilstrings zurück, andernfalls null, beginnend mit dem Index init falls vorhanden (Standardeinstellung 1).

("Hello, I am a string"):find "am" --> returns 10 11
-- equivalent to string.find("Hello, I am a string", "am") -- see remarks

Muster einführen

("hello world"):find ".- " -- will match characters until it finds a space
    --> so it will return 1, 6

Mit Ausnahme der folgenden Zeichen repräsentieren alle sich selbst ^$()%.[]*+-?) . Jedes dieser Zeichen kann durch ein % nach dem Zeichen selbst dargestellt werden.

("137'5 m47ch s0m3 d1g175"):find "m%d%d" -- will match an m followed by 2 digit
    --> this will match m47 and return 7, 9

("stack overflow"):find "[abc]" -- will match an 'a', a 'b' or a 'c'
    --> this will return 3 (the A in stAck)

("stack overflow"):find "[^stack ]"
    -- will match all EXCEPT the letters s, t, a, c and k and the space character
    --> this will match the o in overflow

("hello"):find "o%d?" --> matches o, returns 5, 5
("hello20"):find "o%d?" --> matches o2, returns 5, 6
    -- the ? means the character is optional

("helllllo"):find "el+" --> will match elllll
("heo"):find "el+" --> won't match anything

("helllllo"):find "el*" --> will match elllll
("heo"):find "el*" --> will match e

("helelo"):find "h.+l" -- + will match as much as it gets
    --> this matches "helel"
("helelo"):find "h.-l" -- - will match as few as it can
    --> this wil only match "hel"

("hello"):match "o%d*"
    --> like ?, this matches the "o", because %d is optional
("hello20"):match "o%d*"
    --> unlike ?, it maches as many %d as it gets, "o20"
("hello"):match "o%d"
    --> wouldn't find anything, because + looks for 1 or more characters

Die "gmatch" -Funktion

Wie es funktioniert

Die Funktion string.gmatch nimmt eine Eingabezeichenfolge und ein Muster an. Dieses Muster beschreibt, worauf man eigentlich zurückkommt. Diese Funktion gibt eine Funktion zurück, die eigentlich ein Iterator ist. Das Ergebnis dieses Iterators wird mit dem Muster übereinstimmen.

type(("abc"):gmatch ".") --> returns "function"

for char in ("abc"):gmatch "." do
    print char -- this prints:
    --> a
    --> b
    --> c
end

for match in ("#afdde6"):gmatch "%x%x" do
    print("#" .. match) -- prints:
    --> #af
    --> #dd
    --> #e6
end

Captures vorstellen:

Dies ist der regulären Funktion sehr ähnlich, es werden jedoch nur die Erfassungen statt der vollständigen Übereinstimmung zurückgegeben.

for key, value in ("foo = bar, bar=foo"):gmatch "(%w+)%s*=%s*(%w+)" do
    print("key: " .. key .. ", value: " .. value)
    --> key: foo, value: bar
    --> key: bar, value: foo
end

Die gsub Funktion

Verwechseln Sie nicht mit der Funktion string.sub, die einen Teilstring zurückgibt!

Wie es funktioniert

String-Argument

("hello world"):gsub("o", "0")
    --> returns "hell0 w0rld", 2
    -- the 2 means that 2 substrings have been replaced (the 2 Os)

("hello world, how are you?"):gsub("[^%s]+", "word")
    --> returns "word word, word word word?", 5

("hello world"):gsub("([^%s])([^%s]*)", "%2%1")
    --> returns "elloh orldw", 2

Funktionsargument

local word = "[^%s]+"

function func(str)
    if str:sub(1,1):lower()=="h" then
        return str
    else
        return "no_h"
    end
end
("hello world"):gsub(word, func)
    --> returns "hello no_h", 2

Tabellenargument

local word = "[^%s]+"

sub = {}
sub["hello"] = "g'day"
sub["world"] = "m8"

("hello world"):gsub(word, sub)
    --> returns "g'day m8"

("hello world, how are you?"):gsub(word, sub)
    --> returns "g'day m8, how are you?"
    -- words that are not in the table are simply ignored


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow