Search code examples
lualua-patterns

Unexpected lua pattern matching result


For the following code:

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", I get:

C://data // file.text

But For path = "C:\data\file.text", I get:

nil nil nil

I am looking for a pattern which woks for both. Any suggestions?


Solution

  • The problem is that the first .+ matches greedily and grabs all up to the last \ and then backtracks. Then, one \ can be matched with [\\/], and thus the first group has one backslash, and the second has got the second.

    You can fix it by using

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

    See IDEONE demo

    Explanation:

    • ^ - start of string
    • (.-) - any characters but as few as possible (lazy matching with - quantifier)
    • ([/\\]+) - 1+ / or \
    • ([^/\\]+) - 1+ characters other than / and \
    • $ - end of string