意外的 lua 模式匹配结果

Unexpected lua pattern matching result

对于以下代码:

local function getParentPath(_path)

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

end

print(getParentPath(path))

对于路径 = "C://data//file.text",我得到:

C://data // file.text

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

nil nil nil

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

完全符合预期。首先贪心 (.+) 在不破坏以下模式的情况下尽可能多地匹配符号 - 即直到最后一个斜线的所有内容都是 ([/\]+) 匹配所必需的。

问题是第一个.+贪婪匹配,抢到最后一个\然后回溯。然后,一个\可以匹配到[\/],这样第一组有一个反斜杠,第二组有第二个

您可以使用

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

IDEONE demo

解释:

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