2016-03-24 10 views
4

Für den folgenden Code:Unexpected lua Pattern-Matching-Ergebnis

local function getParentPath(_path) 

    pattern = "(.+)([/\\][/\\])(.+)" 
    i,j,k = string.match(path,pattern) 
    return i,j,k 

end 

print(getParentPath(path)) 

Für path = "C: //data//file.text", erhalte ich:

C://data // file.text 

Aber für path = "C: \ data \ file.text", erhalte ich:

nil nil nil 

ich nach einem Muster suchen, die für beide Woks. Irgendwelche Vorschläge?

+0

Können Sie mehr Details erarbeiten, was Sie passen erwartet haben zu? Alles bis zum letzten '//'? Es gibt zwei von ihnen in Ihrer Zeichenfolge und es ist nicht klar, was Sie wirklich wollen, nur aus einem Beispiel. –

+0

Entschuldigung, ich habe meine Frage umrahmt – tanzil

Antwort

5

Das Problem ist, dass die erste .+ gierig passt und packt alle bis zu den letzten \ und dann Backtracks. Dann kann eine \ mit [\\/] verglichen werden, und somit hat die erste Gruppe einen Backslash und die zweite hat die zweite.

Sie können das Problem beheben, indem Sie

pattern = "^(.-)([/\\]+)([^/\\]+)$" 

Siehe IDEONE demo

Erläuterung:

  • ^ - Beginn der Zeichenfolge
  • (.-) - alle Zeichen, aber so wenig wie möglich (faul übereinstimmend mit - Quantifizierer)
  • ([/\\]+) - 1+ / oder \
  • ([^/\\]+) - 1+ andere Zeichen als / und \
  • $ - Ende der Zeichenkette
+1

Überprüfen Sie auch http://stackoverflow.com/questions/9102126/lua-return-directory-path-from-path –

+1

Danke für detaillierte Erklärung! – tanzil

3

Es ist perfekt zu erwarten. Erste gierige (.+) passt so viele Symbole wie es kann, ohne folgende Muster zu brechen - d. H. Alles bis zum allerletzten Schrägstrich, der erforderlich ist, um ([/\\]+) übereinstimmen.