这里是Java 8。我正在被传递一个String,我需要知道它是否与我们对语义版本化的JAR文件的间隔呈现相匹配,这是:
-)
.jar后缀结尾有效文件名示例:
some-lib-1.4.17.jarsomeLib-1.4.17.jarsomelib-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。所以我的正则表达式在语法上有问题,但我甚至不确定它的设置是否正确,以给我正在寻找的东西。你知道我要去哪里吗?
发布于 2019-02-21 17:58:01
除了那个未封闭字符类,你现在的正则表达式中似乎还有一些问题,
^([a-zA-Z\\-))((\\d+)\\.(\\d+)\\.(\\d+)).jar如果您的目的是只匹配,您不需要不必要的分组正则表达式和数量的分组是沉重的。此外,当-在字符类中并出现在字符类的开始或结束时,您不需要转义它。由于您的字符串有多个字符的someLib,因此您需要有带有字符类的量词,并且需要在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此外,您还可以像这样编写更简洁的regex,以匹配给定的文本,
^[a-zA-Z]+-(\\d+\\.)+jar在[a-zA-Z]+匹配一个或多个字母的情况下,-匹配一个连字符,(\\d+\\.)+匹配一个或多个数字,后面跟着一个或多个文字点,其中一个或多个字符匹配一次或多次,最后jar匹配文本jar。
https://stackoverflow.com/questions/54813128
复制相似问题