java - 这是 Java 正则表达式实现中的错误吗?

标签 java regex

我正在尝试将字符串 iso_schematron_skeleton_for_xslt1.xsl 与正则表达式 ([a-zA-Z|_])?(\w+|_|\.|-) 进行匹配+(@\d{4}-\d{2}-\d{2})?\.yang.

预期结果为false,不应该匹配。

问题是对 matcher.matches() 的调用永远不会返回。

这是 Java 正则表达式实现中的错误吗?

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloWorld{
    private static final Pattern YANG_MODULE_RE = Pattern
            .compile("([a-zA-Z|_])?(\\w+|_|\\.|-)+(@\\d{4}-\\d{2}-\\d{2})?\\.yang");

     public static void main(String []args){
        final Matcher matcher = YANG_MODULE_RE.matcher("iso_schematron_skeleton_for_xslt1.xsl");
        System.out.println(Boolean.toString( matcher.matches()));
     }
}

我正在使用:

openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b15)
OpenJDK 64-Bit Server VM (build 25.181-b15, mixed mode)

最佳答案

该模式包含嵌套量词。 \w+ 位于一个本身由 + 量化的组中,这使得正则表达式引擎很难处理不匹配的字符串。从交替组中创建一个字符类更有意义,即 (\\w+|_|\\.|-)+ => [\\w.-]+

请注意 \w 已经匹配 _。此外,字符类中的 | 匹配文字 | 字符,而 [a|b] 匹配 a|b,所以您似乎应该从第一个字符类中删除 |

使用

.compile("[a-zA-Z_]?[\\w.-]+(?:@\\d{4}-\\d{2}-\\d{2})?\\.yang")

请注意,您可以使用非捕获组 ((?:...)) 而不是捕获组,以避免在您只是检查匹配项时不需要的更多开销而不是提取子字符串。

参见 regex demo (由于该模式与 matches() 一起使用,因此需要完整的字符串匹配,因此我在正则表达式演示中添加了 ^$)。

关于java - 这是 Java 正则表达式实现中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53004478/

相关文章:

ArrayList处理中的java.util.ConcurrentModificationException

java - Java中不能使用 "extend"命令,否则程序崩溃

javascript - 需要使用正则表达式从时区字符串中删除 Offset

python - 为什么我的 Python 正则表达式模式运行如此缓慢?

python - 如何在 Python 中用空字符串替换引号“和连字符?

java - 为什么编译器没有出现错误?

java - 在构造函数或后方法中初始化 CDI 注入(inject)组件?

java - 停止后移动速度继续有用

C# Regex 替换字符串末尾的圆括号和内容

javascript - jQuery Select 的转义括号