我写了一个正则表达式,该正则表达式与符合Semantic Versioning 2.0.0规范的字符串匹配(请参见下文)。正则表达式匹配非零前缀数字*或*字母数字
该表达式的中间部分处理解析预发布版本。本部分的前缀为连字符( - ),可以有一个或多个以句点(。)分隔的标识符。每个标识符都是字母数字(0-9,A-Z,a-z或连字符),但如果标识符是数字,则必须使用而不是以前导零开头。
是否有一种更简洁的方式来表示我用来执行非零前缀规则的替代组?
该正则表达式适用于.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-]+
)*
)
)?
$
我认为解决方案可能与lookaround运算符有关,但我不知道如何去做。
看起来好,最新的问题是什么? – sln
本身没有问题,@sln。虽然这是一个相当长的正则表达式,我想知道是否有可能降低中间部分的复杂性并使其意图更明显。我在想那些跟着我的人,真的。我不亲切吗? ;) –