Java 语义版本正则表达式中的未闭合字符 class

Unclosed character class in Java semver regex

Java 8 在这里。我收到了一个 String,我需要判断它是否与我们对语义版本控制的 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。所以我的正则表达式在语法上有问题,但我什至不确定它是否正确设置以提供我正在寻找的内容。有什么地方会出错吗?

除了那个未闭合的字符 class,您当前的正则表达式似乎还有一些问题,

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

如果您的目的只是匹配,则不需要对正则表达式进行不必要的分组,并且分组的数量很大。此外,当 - 在字符 class 内并且出现在字符 class 的开头或结尾时,您也不需要转义 -。由于您的字符串具有 someLib ,它不止一个字符,因此您需要具有字符 class 的量词,并且您需要在 jar 之前转义最后一个点,否则它可能匹配任何字符可能不可取。您可以使用的正确正则表达式如下,

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

这是Java代码,

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());

现在打印,

true

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

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

其中 [a-zA-Z]+ 匹配一个或多个字母,- 匹配一个连字符,(\d+\.)+ 匹配一个或多个数字后跟文字点和整个数字一次或多次,然后最后 jar 匹配文字 jar