我编写了一个正则表达式,它与符合Semantic Versioning 2.0.0规范的字符串匹配(见下文)。
表达式的中间部分处理解析预发布版本。此部分以连字符 (-) 为前缀,并且可以有一个或多个用句点 (.) 分隔的标识符。每个标识符都是字母数字(0-9、AZ、az 或连字符),但如果标识符是数字,则它不能以前导零开头。
是否有更简洁的方式来表示我用来执行非零前缀规则的交替组?
此正则表达式适用于 .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-]+
)*
)
)?
$
我认为该解决方案可能与环视运算符有关,但我不确定如何去做。