Reputation: 1481
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?
Upvotes: 4
Views: 183
Reputation: 627468
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 stringUpvotes: 5
Reputation: 22471
It is perfectly expected. First greedy (.+)
matches as many symbols as it can without breaking following patterns - i.e. everything up to very last slash that is necessary to make ([/\\]+)
match.
Upvotes: 3