Java 语义版本正则表达式中的未闭合字符 class
Unclosed character class in Java semver regex
Java 8 在这里。我收到了一个 String
,我需要判断它是否与我们对语义版本控制的 JAR 文件的间隔再现相匹配,其中:
- 以任何字母数字字符串开头(此处也允许使用连字符)
- 后跟一个连字符 (
-
)
- 后面是普通的semver:
- 主要版本号;然后
- 次要版本号;然后
- 补丁号
- 以
.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
。所以我的正则表达式在语法上有问题,但我什至不确定它是否正确设置以提供我正在寻找的内容。有什么地方会出错吗?
除了那个未闭合的字符 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
Java 8 在这里。我收到了一个 String
,我需要判断它是否与我们对语义版本控制的 JAR 文件的间隔再现相匹配,其中:
- 以任何字母数字字符串开头(此处也允许使用连字符)
- 后跟一个连字符 (
-
) - 后面是普通的semver:
- 主要版本号;然后
- 次要版本号;然后
- 补丁号
- 以
.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
。所以我的正则表达式在语法上有问题,但我什至不确定它是否正确设置以提供我正在寻找的内容。有什么地方会出错吗?
除了那个未闭合的字符 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