【问题标题】:Regular Expression for Optional characters可选字符的正则表达式
【发布时间】:2018-07-03 18:14:11
【问题描述】:

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

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

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

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

请帮忙

【问题讨论】:

    标签: regex regex-group


    【解决方案1】:

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

    您可以使用[^\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

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多