我正在尝试获取一个 Java 方法来验证参数是否是格式String正确的“ semver ”(语义版本控制)版本字符串。在我的应用程序中,semver 字符串必须采用以下形式:<major>.<minor>.<patch>-<qualifier>在哪里:<major>是正整数 (1+)<minor>和<patch>都是非负整数 (0+)<qualifier>是一个字母数字字符串 ( ([0-9][a-z][A-Z])+)有效示例:1.2.401.0.0-SNAPSHOT2.0.45-RC3.10.0迄今为止我最好的尝试:public boolean isSemVer(String version) { Pattern versionPattern = Pattern.compile("^[a-zA-Z-]+\\d+\\.\\d+\\.\\d+"); Matcher matcher = versionPattern.matcher(version); return matcher.matches();}生成false的第一个有效示例1.2.40。谁能告诉我哪里出了问题以及我需要在正则表达式中进行哪些调整才能让它接受我的用例?提前致谢!
2 回答
白猪掌柜的
TA贡献1893条经验 获得超10个赞
您的有效字符串以数字而不是字母开头,因此[a-zA-Z-]+
在您的模式中已经使模式错误。
使用
^[1-9]\d*\.\d+\.\d+(?:-[a-zA-Z0-9]+)?$
请参阅正则表达式演示
细节
^
- 字符串的开头[1-9]\d*
- 一个从1
到 的数字9
,然后是 0 个或多个数字\.\d+\.\d+
- 两次出现.
和 1+ 数字(可以写成(?:\.\d+){2}
)(?:-[a-zA-Z0-9]+)?
- 可选出现-
和 1+ 个字母数字字符([a-zA-Z0-9]
可以写为\p{Alnum}
)$
- 字符串末尾。
在 Java 中,与 一起使用.matches()
:
public boolean isSemVer(String version) {
Pattern versionPattern = Pattern.compile("[1-9]\\d*\\.\\d+\\.\\d+(?:-[a-zA-Z0-9]+)?");
Matcher matcher = versionPattern.matcher(version);
return matcher.matches();
}
喵喔喔
TA贡献1735条经验 获得超5个赞
您可以尝试使用官方SemVer 正则表达式
"^(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-]+)*))?$"gm
添加回答
举报
0/150
提交
取消