2017-02-14 2 views
1

Ich habe einfach Text wie folgt:Verwenden einzelnes Muster mehrere Wörter Lua Script String Match

Hello World [all 1] 
Hi World [words 2] 
World World [are 3] 
Hello Hello [different 4] 

ich alle Wörter in der eckigen Klammer als Variable in Array gesetzt werden sollen unter Verwendung von Lua. Ich versuche, diesen Code unten:

text = 'Hello World [all 1]\nHi World [words 2]\nWorld World [are 3]\nHello Hello [different 4]' 

array = {string.match(text, '[%a%s]*%[([%a%s%d]*)%]')} 

for i = 1,#array do 
print(array[i]) 
end 

Der Ausgang ist "alles 1". Mein Ziel ist es Ausgabe als

all 1 
words 2 
are 3 
different 4 

ich versucht habe, auszudrucken, wie unten hinzuzufügen 3 gleiche Muster:

array = {string.match(text, '[%a%s]*%[([%a%s%d]*)%].-[%a%s]*%[([%a%s%d]*)%].-[%a%s]*%[([%a%s%d]*)%].-[%a%s]*%[([%a%s%d]*)%]')} 

Es funktioniert. Aber ich denke nicht, dass es der beste Weg ist, besonders wenn der Text eine Menge Zeilen wie 100 usw. enthält. Was ist der richtige Weg dafür?

danke im voraus.

+0

Sind diese Zeilen in einer Datei oder ist es eine einzelne Zeichenfolge, die Sie durchsuchen möchten? –

+0

danke für die schnelle Antwort. Es ist eine einzelne Zeichenfolge, die alle obigen Wörter enthält. – wakhaiha

+0

'array = {} für s in s: gmatch '% b []' tun Array [# Array + 1] = s: Sub (2, -2) Ende – tonypdmtr

Antwort

1

Lua Muster do not support repeated captures, aber Sie können string.gmatch() verwenden, die eine Iterator-Funktion gibt, mit einer Eingabezeichenfolge, unter Verwendung des Musters "%[(.-)%]" den gewünschten Text zu erfassen:

text = 'Hello World [all 1]\nHi World [words 2]\nWorld World [are 3]\nHello Hello [different 4]' 

local array = {} 
for capture in string.gmatch(text, "%[(.-)%]") do 
    table.insert(array, capture) 
end 

for i = 1, #array do 
    print(array[i]) 
end 

Der obige Code gibt Ausgang:

all 1 
words 2 
are 3 
different 4 

Beachten Sie, dass diese in einer einzigen Zeile durchgeführt werden kann, falls gewünscht:

array = {} for c in string.gmatch(text, "%[(.-)]") do table.insert(array, c) end 

Beachten Sie auch, dass eine isolierte schließende Klammer nicht entfernt werden muss, wie dieses letzte Beispiel zeigt.