意外的lua模式匹配结果



对于以下代码:

local function getParentPath(_path)
    pattern = "(.+)([/\][/\])(.+)"
    i,j,k = string.match(path,pattern)
    return i,j,k
end
print(getParentPath(path))

For path = "C://data//file. "text",我得到:

C://data // file.text

But For path = "C:datafile. "text",我得到:

nil nil nil

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

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

可以使用

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

参见IDEONE demo

解释:

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

这完全在意料之中。首先,贪婪的(.+)匹配尽可能多的符号,而不会破坏以下模式-即,直到最后一个斜杠,这是使([/\]+)匹配所必需的。

最新更新