lua模式匹配结果异常

以下代码:

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

我正在寻找适用于两种情况的模式。有什么建议吗?

点赞
用户936986
用户936986

这是完全合理的。首先,贪婪的 (.+) 匹配尽可能多的符号而不破坏后续模式 - 即匹配 ([/\\]+) 所需的最后一个斜杠之前的所有内容。

2016-03-24 16:20:52
用户3832970
用户3832970

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

你可以通过使用以下代码进行修复:

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

请参见 IDEONE 示例

解释:

  • ^ - 字符串的开始
  • (.-) - 匹配任何字符但尽可能少(使用 - 量词进行懒惰匹配)
  • ([/\\]+) - 匹配 1+ /\
  • ([^/\\]+) - 匹配 1+ 个字符,不能是 /\
  • $ - 字符串的结尾
2016-03-24 16:23:57