这是 Java regexp 实现中的错误吗?

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


预期的结果是false,它不应该匹配。


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


这是 Java regexp 实现中的错误吗?


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)


噜噜哒
浏览 200回答 1
1回答

牛魔王的故事

该模式包含嵌套的量词。的\w+是一组本身与量化内部+,这使得它很难的正则表达式引擎的过程不匹配的字符串。从交替组中创建字符类更有意义,即(\\w+|_|\\.|-)+=> [\\w.-]+。请注意,\w已经匹配_. 此外,|字符类中的 a 匹配文字|字符,并[a|b]匹配a, |or b,因此您似乎应该|从第一个字符类中删除。用.compile("[a-zA-Z_]?[\\w.-]+(?:@\\d{4}-\\d{2}-\\d{2})?\\.yang")请注意,您可以使用非捕获组 ( (?:...)) 而不是捕获组,以避免产生更多不需要的开销,因为您只是在检查匹配项而不是提取子字符串。请参阅正则表达式演示(因为该模式用于使用matches(),因此需要完整的字符串匹配,我在正则表达式演示中添加了^和$)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java