可选字符的正则表达式

时间:2018-07-03 18:14:11

标签: regex regex-group

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

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

路径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值

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

请帮助

1 个答案:

答案 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

请参见another regex demo

enter image description here