可选字符的正则表达式
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=(.*)\/(.*)
^^^^^^^ ^^^ ^^
或者,让 \w
变得懒惰而不是从 \w
中减去 _
(如果可以有 _
除了您需要捕获的数字之前的那个) :
\/a\/b\/c\/(\w*?)(?:_([0-9]+))?\/p1=(.*)\/p2=(.*)\/p3=(.*)\/(.*)
^^^^
我需要验证文件路径。其中一个目录可以包含版本号。
以下是我可能遇到的两种可能的路径。
路径 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=(.*)\/(.*)
^^^^^^^ ^^^ ^^
或者,让 \w
变得懒惰而不是从 \w
中减去 _
(如果可以有 _
除了您需要捕获的数字之前的那个) :
\/a\/b\/c\/(\w*?)(?:_([0-9]+))?\/p1=(.*)\/p2=(.*)\/p3=(.*)\/(.*)
^^^^