可选字符的正则表达式

Regular Expression for Optional characters

我需要验证文件路径。其中一个目录可以包含版本号。

以下是我可能遇到的两种可能的路径。

路径 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 的正确值

我试过添加'?'在下划线之后,但这也无济于事。

请帮忙

问题是 \w 匹配字母、数字 _。它用贪婪量词 + 进行量化,从而使后续的相邻模式可选地匹配不匹配文本之前的空字符串。 (\w+)_?([0-9]+)\/ 将抓取所有字母、数字、_ 直到 d_9000/ 中的 /,只有最后一个 0 会落入第 3 组,因为 [=20] =] 应至少匹配一位数字。

您可以使用 [^\W_]\w 中排除 _ 并通过用可选的非捕获组包装它来使 _([0-9]+) 模式可选:

\/a\/b\/c\/([^\W_]+)(?:_([0-9]+))?\/p1=(.*)\/p2=(.*)\/p3=(.*)\/(.*)
            ^^^^^^^ ^^^         ^^   

this regex demo

或者,让 \w 变得懒惰而不是从 \w 中减去 _(如果可以有 _ 除了您需要捕获的数字之前的那个) :

\/a\/b\/c\/(\w*?)(?:_([0-9]+))?\/p1=(.*)\/p2=(.*)\/p3=(.*)\/(.*)
            ^^^^

参见 another regex demo