Java semver正则表达式中的未封闭字符类

时间:2019-02-21 17:39:03

标签: regex string java-8 semantic-versioning

Java 8在这里。我正在通过一个String,我需要告诉它是否与我们语义转换的JAR文件的间隔格式匹配,

  • 以任何字母数字字符串开头(此处也允许使用连字符)
  • 紧跟着连字符(-
  • 之后是正常的语气:
    • 主要版本号;然后
    • 次要发行号;然后
    • 补丁号
  • 后缀为.jar

有效文件名示例:

  • some-lib-1.4.17.jar
  • someLib-1.4.17.jar
  • somelib-0.12.0.jar

到目前为止我最大的尝试:

public boolean isValidJarName(String jarName) {
    String fileRegex = "^([a-zA-Z\\-))((\\d+)\\.(\\d+)\\.(\\d+)).jar";
    Pattern filePattern = Pattern.compile(fileRegex);
    Matcher matcher = filePattern.matcher(jarName);

    return matcher.matches();
}

但是,这给了我一个编译器错误:Unclosed character class。所以我的正则表达式在语法上出了点问题,但是我什至不确定它的设置是否正确以提供所需的信息。有什么想法我要去哪里吗?

1 个答案:

答案 0 :(得分:2)

除了未封闭的字符类,您当前的正则表达式中似乎还有其他问题,

^([a-zA-Z\\-))((\\d+)\\.(\\d+)\\.(\\d+)).jar

如果您只是想匹配,则不需要不必要地对正则表达式进行分组,并且分组量很大。同样,当-在字符类内部并且出现在字符类的开始或结尾时,也不需要转义someLib。由于您的字符串中的jar多于一个字符,因此您需要具有字符类的量词,并且需要在^[a-zA-Z-]+\\d+\\.\\d+\\.\\d+\\.jar 之前转义最后一个点,否则它可能与任何不需要的字符匹配。您可以使用正确的正则表达式,

String jarName = "someLib-1.2.3.jar";
String fileRegex = "^[a-zA-Z-]+\\d+\\.\\d+\\.\\d+\\.jar";
Pattern filePattern = Pattern.compile(fileRegex);
Matcher matcher = filePattern.matcher(jarName);

System.out.println(matcher.matches());

这是Java代码,

true

现在打印,

^[a-zA-Z]+-(\\d+\\.)+jar

此外,您可以像这样紧凑地编写正则表达式以匹配给定的文本,

[a-zA-Z]+

如果-匹配一个或多个字母,(\\d+\\.)+匹配一个连字符,jar匹配一个或多个数字,后跟文字点,然后将其全部或多次,然后{ {1}}与文字jar

匹配