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
。所以我的正则表达式在语法上出了点问题,但是我什至不确定它的设置是否正确以提供所需的信息。有什么想法我要去哪里吗?
答案 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