我正在寻找与版本号匹配的正则表达式模式。
我在这里找到的解决方案并不真正符合我的需要。
我需要该模式对单个数字以及后跟 .
有效数字是
1
1.23
1.2.53.4
Run Code Online (Sandbox Code Playgroud)
无效的数字是
01
1.02.3
.1.2
1.2.
-1
Run Code Online (Sandbox Code Playgroud)
0.1.2:^([1-9]\d*|0)(\.(([1-9]\d*)|0)){2}$
1.1.5.0或只是1.2:^([1-9]\d*|0)(\.(([1-9]\d*)|0)){0,3}$
|0第一组中没有:^([1-9]\d*)(\.(([1-9]\d*)|0)){0,3}$
1.0.0-beta^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
^:匹配行开头$: 匹配行尾(和):建立一个小组([1-9]\d*|0): 匹配版本号
[1-9]\d*:以1~9开头,后面任意位数|:逻辑或0: 字面量为零\.: 文字(转义)点{2}:精确 2 个匹配项{0,3}: 0~3 场比赛匹配:
0.0.0
0.0.1
0.1.0
1.0.0
1.0.1
1.1.0
1.1.1
0.0.10
0.10.0
10.0.0
0.1.10
1.0.10
1.0.100
0.100.1
100.0.0
1.20.0
Run Code Online (Sandbox Code Playgroud)
不匹配:
0.0.00
0.00.0
00.00.0
0.0.01
0.01.0
01.0.0
0.01.0
01.0.0
00.0.01
Run Code Online (Sandbox Code Playgroud)
考虑:
^[1-9]\d*(\.[1-9]\d*)*$
打破它:
^ - 从字符串的开头开始。[1-9] - 正好是字符 1 到 9 之一。\d* - 更多数字。( - 一些可选的额外内容的开始\. - 一个文字点。[1-9] - 正好是字符 1 到 9 之一。\d* - 更多数字。) - 结束可选的额外内容。* - 可以有任意数量的那些可选的额外东西。$ - 并在字符串的末尾结束。谨防
其中一些语法因您使用的正则表达式引擎而异。例如,您是否使用 Perl、PHP、Javascript、C#、MySQL...中的一个?
根据我的经验,版本号不符合您描述的简洁格式。
特别是,你得到的值喜欢0.3RC5,12.0-beta6,2019.04.15-alpha4.5,3.1stable,V6.8pl7等等。
如果您要验证现有数据,请确保您的标准符合您所描述的条件。特别是,如果您遵循“语义版本控制”,请注意零版本是合法的,因此 1.0.1,“预发布和构建元数据的附加标签可用作 MAJOR.MINOR.PATCH 格式的扩展.”,而“1”不是合法的版本号。
请注意,上述内容也会匹配愚蠢的长版本号,例如1.2.3.4.5.6.7.8.9.10.11.12.13.14. 为了防止这种情况,您可以限制它,如下所示:
^[1-9]\d*(\.[1-9]\d*){0,3}$
这会将*“任意数量的可选额外点和数字”更改为从零到三的范围。所以它会接受1, 1.2, 1.2.3, 和1.2.3.4,但不接受1.2.3.4.5。
此外,如果您希望零是合法的,但前提是没有其他数字(所以0.3, 1.0.1),那么它会变得更复杂一些:
^(0|[1-9]\d*)(\.(0|[1-9]\d*)){0,3}$
这个问题也可能是重复的:A regex for version number parsing