首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java语义正则表达式中的未闭字符类

Java语义正则表达式中的未闭字符类
EN

Stack Overflow用户
提问于 2019-02-21 17:39:03
回答 1查看 111关注 0票数 1

这里是Java 8。我正在被传递一个String,我需要知道它是否与我们对语义版本化的JAR文件的间隔呈现相匹配,这是:

  • 以任何字母数字字符串开始(这里也允许连字符)
  • 接着是催眠术(-)
  • 接着是正常义符:
    • 主要发行号
    • 次要发行号码;然后
    • 贴片号

  • .jar后缀结尾

有效文件名示例:

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

到目前为止,我最大的努力是:

代码语言:javascript
复制
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。所以我的正则表达式在语法上有问题,但我甚至不确定它的设置是否正确,以给我正在寻找的东西。你知道我要去哪里吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-21 17:58:01

除了那个未封闭字符类,你现在的正则表达式中似乎还有一些问题,

代码语言:javascript
复制
^([a-zA-Z\\-))((\\d+)\\.(\\d+)\\.(\\d+)).jar

如果您的目的是只匹配,您不需要不必要的分组正则表达式和数量的分组是沉重的。此外,当-在字符类中并出现在字符类的开始或结束时,您不需要转义它。由于您的字符串有多个字符的someLib,因此您需要有带有字符类的量词,并且需要在jar之前转义最后一个点,否则它可能匹配任何可能不理想的字符。您可以使用的正确正则表达式如下,

代码语言:javascript
复制
^[a-zA-Z-]+\\d+\\.\\d+\\.\\d+\\.jar

这是Java代码,

代码语言:javascript
复制
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());

这个印出来了,

代码语言:javascript
复制
true

此外,您还可以像这样编写更简洁的regex,以匹配给定的文本,

代码语言:javascript
复制
^[a-zA-Z]+-(\\d+\\.)+jar

[a-zA-Z]+匹配一个或多个字母的情况下,-匹配一个连字符,(\\d+\\.)+匹配一个或多个数字,后面跟着一个或多个文字点,其中一个或多个字符匹配一次或多次,最后jar匹配文本jar

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54813128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档