Java正则表达式:如何从字符串中提取指定格式的版本号?
正则提取版本号解决方案
需求示例
原始字符串与目标提取结果对应:
0.6.9b-version - 0.6.9b
v0.6.99 - 0.6.99
v01.23.97 - 01.23.97
v01.23.97a-release - 01.23.97a
v1.23.97a-release - 1.23.97a
正确正则方案
方案1:精准匹配分隔符后的版本号
针对原始字符串中版本号位于-后方的特点,使用带正向断言的正则,确保只提取分隔符后的目标内容:
(?<=\s*-\s*)\d+(?:\.\d+)*(?:[a-z])?
(?<=\s*-\s*):正向预查,匹配任意数量空格包裹的-,兼容原始字符串中-前后空格数量不一致的情况\d+:匹配版本号开头的至少一位数字(?:\.\d+)*:匹配0个或多个.数字格式的子版本段(非捕获组,避免多余分组)(?:[a-z])?:可选匹配末尾的小写字母后缀,兼容无字母的版本号
方案2:直接匹配符合格式的版本号
如果不需要依赖分隔符位置,直接提取所有符合版本格式的内容(会跳过开头的v前缀):
\d+(?:\.\d+)*(?:[a-z])?
原正则问题分析
你之前使用的(\d[\w.()]+?[a-z])存在两个核心问题:
- 强制要求版本号末尾必须有小写字母,导致无字母的版本号(如
0.6.99)无法匹配 - 没有限定匹配范围,会错误匹配原始字符串中左侧带后缀(如
-version)的部分
内容的提问来源于stack exchange,提问作者rastorguev.i.a
相关产品推荐
相关产品推荐

