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

7
我正在寻找一个匹配版本号的正则表达式模式。
我在这里找到的解决方案并不完全符合我的需求。
我需要该模式对单个数字和后跟点号的数字都有效。
有效数字包括:
1
1.23
1.2.53.4

无效的数字包括:

01
1.02.3
.1.2
1.2.
-1

1
请注意我的回答更新了 - 解析版本格式时可能会遇到许多陷阱,您可能需要注意。 - Dewi Morgan
4个回答

10
考虑以下正则表达式:
``` ^[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,“用于预发行和构建元数据的其他标签可作为主要.次要.补丁格式的扩展”,以及“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}$

这个问题可能是一个重复的问题:解析版本号的正则表达式


1
你是最棒的。我又来问关于接受1.0.1但拒绝1.01.1的情况,发现你已经在评论中提到了。 - Ziko
你使用的正则表达式引擎是什么?它对我有效,参见:https://regex101.com/r/bOpKER/1 - Dewi Morgan
1
不用在意我删除的评论了,我已经在我的端口修复了。 - Ziko

6

主次补丁版本 - 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}: 正好匹配两次
  • {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

不匹配:

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

0

这个正则表达式应该有所帮助:

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

以下是解释。 [1-9]+\d* 表示以非零数字开头,后跟零个或多个数字的序列
第一部分 (([1-9]+\d*\.)+[1-9]+\d*) 捕获了除1之外的所有正确示例,因此我们有一个|(或),后跟一个[1-9]+\d*序列。

但是如果我测试01,它会捕获1,因此它变得有效。 对于1.2也是如此,它会捕获1.2。 - Ziko
尝试使用“A”(“Anchored”)修饰符。请参见此处的示例:https://regex101.com/r/KK0eQT/1 - Ildar Akhmetov
非常感谢。最后,我想知道我们是否可以推广“0数字不合法”的规则。例如:1.2.3.04 - Ziko

0

([\*,\^])([\-,\*,\w]+[\.])+(\w)*

例如,对于npm包

    "cross-env": "^5.2.0",

2
请花点时间阅读[编辑帮助](//stackoverflow.com/editing-help)中的内容。在Stack Overflow上进行格式设置与其他网站不同。 - Dharman
这不允许使用固定版本号,如“5.2.0” ,必须使用例如“^5.2.0”或“~5.2.0”。 - dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接