如何利用正则表达式实现对原始语义版本号(SemVer)的比较前置解析

阿宇大大_4881

阿宇大大_4881

2026-04-30

582人浏览

原创

正则表达式不能直接比较版本号大小,但可精准提取SemVer的主、次、修订号及预发布/构建元数据;推荐表达式为^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$,其中$1$2$3对应三段数字,$4为预发布字段(空表示稳定版),$5为构建元数据(比较时忽略)。

如何利用正则表达式实现对原始语义版本号(semver)的比较前置解析

正则表达式本身不能直接比较版本号大小,但可以高效提取语义化版本(SemVer)的主版本、次版本、修订号及预发布/构建元数据,为后续程序化比较提供结构化输入。关键在于精准捕获三段数字和可选标识符。

匹配标准 SemVer 格式(含预发布和构建信息)

标准 SemVer 2.0.0 格式为:MAJOR.MINOR.PATCH[-PRERELEASE][+BUILD],其中预发布标识符由点分隔的标识符组成,构建元数据以加号开头且不参与比较。

推荐正则表达式:

^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$
  • $1 $2 $3 分别捕获主、次、修订号(字符串形式,需转数字比较)
  • $4 捕获整个预发布字段(如 alpha.1),为空表示稳定版
  • $5 捕获构建元数据(如 20240501.gitabc123),比较时应忽略
  • (?:...)? 表示非捕获可选组,避免干扰编号顺序

区分预发布版本的内部结构(用于排序)

预发布字段(如 beta.11、rc.2、alpha.0.1)需进一步拆解为标识符序列,按规则逐项比较:纯数字标识符按数值比,非数字或混合标识符按字典序比,且预发布版 无预发布版。

朱雀AI检测
朱雀AI检测

朱雀AI检测是一款AI工具,腾讯推出的AI内容检测助手。

下载

可对 $4 再次使用:

([0-9]+|[^\d.]+)
  • 该模式能交替匹配连续数字(作为整数)或非数字字符串(作为标识符)
  • 例如 beta.11.alpha.2 → ['beta', '11', 'alpha', '2'],再分别转类型后比较
  • 注意跳过空字符串(防双点 .. 等非法情况,实际应先校验格式)

处理常见变体与边界情况

真实场景中可能遇到宽松格式(如省略补零、前导零、多余空格),正则需兼顾健壮性:

  • 允许首部空白:^\s*(\d+)\.(\d+)\.(\d+)
  • 拒绝前导零(除单独的 0):用 (0|[1-9]\d*) 替代 \d+,避免匹配 01.2.3
  • 预发布标识符禁止空段:-([0-9A-Za-z]+(?:\.[0-9A-Za-z]+)*)? 可更严格
  • 构建元数据不参与语义比较,提取后可直接丢弃,无需解析其内部结构

衔接编程语言做最终比较

正则只负责“切分”,比较逻辑必须由宿主语言完成。以 Python 为例:

  • 将 $1,$2,$3 转为 int,直接数值比较
  • 若两者主次修全等,检查是否一方有 $4(即预发布)而另一方无——有者小
  • 若均有 $4,用上述拆解方式生成归一化元组,如 ('beta', 11) vs ('beta', 2) → 11 > 2,故前者大
  • 构建号 $5 不参与任何判断,仅作记录用途

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4676

8

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2023.07.05

3161

4

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8802

9

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

2023.08.11

812

5

正则表达式空格
正则表达式空格

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

520

5

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

693

12

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

2023.11.17

406

3

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.06

739

7

php正则表达式有哪些
php正则表达式有哪些

php正则表达式有"/pattern/"、"^"、"$"、"."、"[]"、"[^]"、"[a-z]"、"[A-Z]"、"[0-9]"、"\d"、"\D"、"\w"、"\W"、&a

2024.02.23

312

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JavaScript正则表达式基础与实战
JavaScript正则表达式基础与实战

共11课时 | 1.7万人学习

布尔教育正则表达式视频教程
布尔教育正则表达式视频教程

共14课时 | 5.1万人学习