我正在嘗試獲取一個 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
提交
取消