Zeichenkettenfunktionen in Lua

(Weitergeleitet von Textbearbeitung in Lua)
Zur Navigation springen Zur Suche springen

string.find

string.find(s,pattern[,init[,plain]])

Sucht nach der ersten Übereinstimmung von pattern in der Zeichenkette s. Wenn eine Übereinstimmung gefunden wird, liefert find die Indizes von s, wo dieses Auftreten beginnt und endet; andernfalls liefert es nil. Ein drittes, optionales Argument init legt fest, wo mit der Suche begonnen werden soll; dessen Standardwert ist 1 und kann negativ sein. Der Wert true als viertes optioales Argument plain schaltet die Mustersuchs-Funktionalität ab, so dass die Funktion eine reine „finde Teil-Zeichenkette“-Operation durchführt, wobei keine Zeichen in pattern als magisch angesehen werden. Wenn plain gegeben ist, muss init ebenfalls angegeben werden.

Wenn das Muster Treffer sichert (mit Captures), werden diese Werte bei einer erfolgreichen Übereinstimmung nach den zwei Indizes ebenfalls zurückgeliefert.
string.find('hello world', 'hello')
--> 1 5
string.find('hello world', 'world')
--> 7 11
string.find('hello world', 'Lua')
--> nil
string.find("name = Anna", "(%a+)%s*=%s*(%a+)")
-->1	11	name	Anna

string.match

string.match(s,pattern[,init])

Sucht nach der ersten Übereinstimmung von pattern in der Zeichenkette s. Falls eine solche gefunden wird, liefert match die Treffer des Musters; andernfalls liefert es nil. Falls pattern keine Treffer spezifiziert, wird die komplette Übereinstimmung zurückgeliefert. Ein drittes, optionales numerisches Argument init gibt an, wo mit der Suche begonnen werden soll; dessen Standardwert ist 1 und kann negativ sein.

string.match liefert nur die gefundene Zeichenkette, im Gegensatz zu string.find, wo man auch die Positionen der Fundstelle erhält.
string.match('hello world', 'hello')
--> hello
string.match('hello world', '^%a-.(.)%a*%s+(%a*)')
--> e	world
string.match('hello world', 'Lua')
--> nil
string.match("name = Anna", "(%a+)%s*=%s*(%a+)")
-->name	Anna

string.gmatch

string.gmatch(s,pattern)

Liefert einen Iterator, welcher bei jedem Aufruf den nächsten Treffer aus pattern in der Zeichenkette s liefert. Falls pattern keine Treffer sichert, wird bei jedem Aufruf die komplette Übereinstimmung erzeugt.
s = "hello world from Lua"
for w in string.gmatch(s,"%a+") do
  print(w)
end

wird über alle Worte der Zeichenkette s iterieren, wobei pro Zeile eines ausgegeben wird.

hello
world
from
Lua
Das nächste Beispiel sammelt alle key=value-Paare der gegebenen Zeichenkette in einer Tabelle:
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s,"(%w+)=(%w+)") do
  t[k] = v
end
from	world
to	Lua

Bei dieser Funktion fungiert ein ^ zu Beginn des Musters nicht als Anker, da dies die Iteration verhindern würde.

string.sub

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

Liefert eine Teil-Zeichenkette von s, welche sich von i bis j erstreckt; i und j können negativ sein. Falls j nicht angegeben wird, wird es als -1 angenommen (was das Gleiche wie die Länge der Zeichenkette ist). Im Speziellen liefert der Aufruf string.sub(s,1,j) ein Präfix von s der Länge j und string.sub(s,-i) liefert ein Suffix von s mit der Länge i.
string.sub("hello world", string.find("hello world", "ello"))
--> ello

string.gsub

string.gsub(s,pattern,repl[,n])

Liefert eine Kopie von s, bei welcher alle (bzw. die ersten n, falls gegeben) Auftreten von pattern durch eine Ersetzungs-Zeichenkette, welche durch repl spezifiziert wurde und eine Zeichenkette, Tabelle oder Funktion sein kann, ersetzt wurden. gsub liefert als zweiten Wert auch die Gesamtzahl aufgetretener Treffer.

Wenn repl eine Zeichenkette ist, wird dessen Wert zur Ersetzung verwendet. Das Zeichen % dient der Maskierung: Jede Sequenz der Form %n in repl mit n zwischen 1 und 9 steht für den Wert der n-ten gesicherten Teil-Zeichenkette (s. u.). Die Sequenz %0 steht für die komplette Übereinstimmung. Die Sequenz %% steht für ein einzelnes %.

Wenn repl eine Tabelle ist, wird die Tabelle mit dem ersten Treffer als Schlüssel für jede Übereinstimmung abgefragt; falls das Muster keine Treffer angibt, wird die komplette Übereinstimmung als Schlüssel verwendet.

Wenn repl eine Funktion ist, wird diese für jede auftretende Übereinstimmung mit allen gesicherten Teil-Zeichenkette als Argumente in entsprechender Reihenfolge aufgerufen; falls das Muster keine Treffer angibt, wird die komplette Übereinstimmung als einziges Argument übergeben.

Wenn der von einer Tabellenabfrage oder Funktion zurückgelieferte Wert eine Zeichenkette oder Zahl ist, wird dies als Ersetzungs-Zeichenkette verwendet; andernfalls – wenn es false oder nil ist – findet keine Ersetzung statt (d. h. die Original-Übereinstimmung wird in der Zeichenkette belassen).
string.sub("hello world", string.find("hello world", "ello"))
--> ello

Links