意外的lua模式匹配结果

时间:2016-03-24 16:16:56

标签: lua lua-patterns

以下代码:

local function getParentPath(_path)

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

end

print(getParentPath(path))

对于path =" C://data//file.text" ;,我得到:

C://data // file.text

但是对于path =" C:\ data \ file.text",我得到:

nil nil nil

我正在寻找一种适合两者的模式。有什么建议吗?

2 个答案:

答案 0 :(得分:5)

问题是第一个.+贪婪地匹配并抓取所有直到最后\然后回溯。然后,一个\可以与[\\/]匹配,因此第一组有一个反斜杠,第二个组有第二个。

您可以使用

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

请参阅IDEONE demo

说明:

  • ^ - 字符串开头
  • (.-) - 任何字符,但尽可能少(与-量词的懒惰匹配)
  • ([/\\]+) - 1 + /\
  • ([^/\\]+) - /\
  • 以外的1个字符
  • $ - 字符串结尾

答案 1 :(得分:3)

完全可以预料到。第一个贪婪的(.+)匹配尽可能多的符号,而不会破坏以下模式 - 即使([/\\]+)匹配所需的最后一个斜杠。