我编写了一个正则表达式,该表达式符合符合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-]+
)*
)
)?
$
我认为解决方案可能与环视操作符有关,但我不确定如何处理它。
答案 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-]* )?
)
)*
)
)?