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

我正在尝试获取一个 Java 方法来验证参数是否是格式String正确的“ semver ”(语义版本控制)版本字符串。

在我的应用程序中,semver 字符串必须采用以下形式:

<major>.<minor>.<patch>-<qualifier>

在哪里:

  • <major>是正整数 (1+)

  • <minor><patch>都是非负整数 (0+)

  • <qualifier>是一个字母数字字符串 ( ([0-9][a-z][A-Z])+)

有效示例:

  • 1.2.40

  • 1.0.0-SNAPSHOT

  • 2.0.45-RC

  • 3.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。谁能告诉我哪里出了问题以及我需要在正则表达式中进行哪些调整才能让它接受我的用例?提前致谢!


慕仙森
浏览 84回答 2
2回答

白猪掌柜的

您的有效字符串以数字而不是字母开头,因此[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) {&nbsp; &nbsp; Pattern versionPattern = Pattern.compile("[1-9]\\d*\\.\\d+\\.\\d+(?:-[a-zA-Z0-9]+)?");&nbsp; &nbsp; Matcher matcher = versionPattern.matcher(version);&nbsp; &nbsp; return matcher.matches();}

喵喔喔

您可以尝试使用官方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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java