正则表达式匹配非零前缀数字* OR *字母数字

时间:2014-02-07 16:59:10

标签: .net regex regex-lookarounds lookahead semantic-versioning

我编写了一个正则表达式,该表达式符合符合Semantic Versioning 2.0.0规范的字符串(见下文)。

表达式的中间部分涉及解析预发布版本。此部分以连字符( - )为前缀,并且可以包含一个或多个由句点(。)分隔的标识符。每个标识符都是字母数字(0-9,A-Z,a-z或连字符),但如果标识符是数字,那么它必须 NOT 以前导零开头。

是否有更简洁的方式来表示我用来强制执行非零前缀规则的交替组?

此正则表达式适用于.NET,使用“x”模式编写,以便允许注释并忽略空格。

^

# ====================================
# Main Major.Minor.Path version number
# ====================================
(?<version>
    (?<major>[1-9]\d*|0)
    \.
    (?<minor>[1-9]\d*|0)
    \.
    (?<patch>[1-9]\d*|0)
)

# ===========================
# Optional preprelease string
# ===========================
(?:
    -                                   # Hyphen indicates start of prerelease.
    (?<prerelease>
        #======================================================================
        # CONFUSION STARTS HERE
        (?:
            [1-9]\d*                    # Numeric identifier (no leading zero).
            |
            [A-Za-z-]+                  # Alpha identifier.
            |
            \d+[A-Za-z-]+[0-9A-Za-z-]*  # Alphanumeric starting w/ numeric.
            |
            [A-Za-z-]+\d+[0-9A-Za-z-]*  # Alphanumeric starting w/ alpha.
        )
        # CONFUSION ENDS HERE - ish
        #======================================================================
        (?:
            \.                          # start of another identifier.
            (
                [1-9]\d*
                |
                [A-Za-z-]+
                |
                \d+[A-Za-z-]+[0-9A-Za-z-]*
                |
                [A-Za-z-]+\d+[0-9A-Za-z-]*
            )
        )*
    )
)?

# =====================
# Optional build string
# =====================
(?:
    \+                                  # Plus sign indicates start of build string.
    (?<build>
        [0-9A-Za-z-]+
        (?:
            \.                          # start of another identifier.
            [0-9A-Za-z-]+
        )*
    )
)?

$

我认为解决方案可能与环视操作符有关,但我不确定如何处理它。

1 个答案:

答案 0 :(得分:1)

可能会稍微缩短预售 的修改
为可能受回溯困扰的[1-9]添加了可能的修复 使用前瞻。

 (?:
       -
       (?<prerelease>
            (?:
                 [1-9] \d* (?![\w-])
              |  \d+ [A-Za-z-]+ [0-9A-Za-z-]* 
              |  [A-Za-z-]+ (?: \d+ [0-9A-Za-z-]* )?
            )
            (?:
                 \.
                 (?:
                      [1-9] \d* (?![\w-]) 
                   |  \d+ [A-Za-z-]+ [0-9A-Za-z-]* 
                   |  [A-Za-z-]+ (?: \d+ [0-9A-Za-z-]* )?
                 )
            )*
       )
  )?