匹配有效版本号的正则表达式模式

Zik*_*iko 1 regex

我正在寻找与版本号匹配的正则表达式模式。

我在这里找到的解决方案并不真正符合我的需要。

我需要该模式对单个数字以及后跟 .

有效数字是

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)

cla*_*tfu 7

Major.Minor.Patch - npm 版本如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 场比赛

测试用例(regex101 JavaScript):

匹配:

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)


Dew*_*gan 5

考虑:

^[1-9]\d*(\.[1-9]\d*)*$

打破它:

  • ^ - 从字符串的开头开始。
  • [1-9] - 正好是字符 1 到 9 之一。
  • \d* - 更多数字。
  • ( - 一些可选的额外内容的开始
  • \. - 一个文字点。
  • [1-9] - 正好是字符 1 到 9 之一。
  • \d* - 更多数字。
  • ) - 结束可选的额外内容。
  • * - 可以有任意数量的那些可选的额外东西。
  • $ - 并在字符串的末尾结束。

谨防

其中一些语法因您使用的正则表达式引擎而异。例如,您是否使用 Perl、PHP、Javascript、C#、MySQL...中的一个?

根据我的经验,版本号不符合您描述的简洁格式。

特别是,你得到的值喜欢0.3RC512.0-beta62019.04.15-alpha4.53.1stableV6.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