为了账号安全,请及时绑定邮箱和手机立即绑定

用于检测 semver 字符串的 Java 正则表达式在没有限定符的情况下失败

用于检测 semver 字符串的 Java 正则表达式在没有限定符的情况下失败

慕仙森 2023-09-13 17:34:20
我正在尝试获取一个 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();

}


查看完整回答
反对 回复 2023-09-13
?
喵喔喔

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



查看完整回答
反对 回复 2023-09-13
  • 2 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信