我需要验证文件路径。其中一个目录可以具有版本号。
以下是我可能遇到的两种可能的路径。
路径1
File path = "/a/b/c/d_9000/p1=<val1>/p2=<val2>/p3=<val3>/<val4>"
预期产量
Group 1 = d
Group 2 = 9000
Group 3 = val1
Group 4 = val2
Group 5 = val3
Group 6 = val4
路径2
File Path = "/a/b/c/d/p1=<val1>/p2=<val2>/p3=<val3>/<val4>"
预期产量
Group 1 = d
Group 2 = <null or empty string>
Group 3 = val1
Group 4 = val2
Group 5 = val3
Group 6 = val4
解析每个文件路径时,我需要在每个组中使用以上值
以下是我尝试过的
\/a\/b\/c\/(\w+)_([0-9]+)\/p1=(.*)\/p2=(.*)\/p3=(.*)\/(.*)
但这不能给我正确的Group1和Group 2值
我尝试添加'?'在下划线之后,但这也无济于事。
请帮助
答案 0 :(得分:1)
问题是\w
匹配字母,数字或_
。它用贪婪的量词+
进行量化,从而使后续的相邻模式可选地匹配不匹配文本之前的空字符串。 (\w+)_?([0-9]+)\/
将抓取_
中/
之前的所有字母,数字和d_9000/
,并且只有{{1 }}至少应匹配1个数字。
您可以使用0
从[0-9]+
中排除_
,并通过将\w
模式包装为一个可选的非捕获组来使其成为可选模式:
[^\W_]
请参见this regex demo。
或者,使_([0-9]+)
变得懒惰,而不是从\/a\/b\/c\/([^\W_]+)(?:_([0-9]+))?\/p1=(.*)\/p2=(.*)\/p3=(.*)\/(.*)
^^^^^^^ ^^^ ^^
中减去\w
(如果可能存在_
,而不是您需要捕获的数字之前的数字):< / p>
\w