繁体   English   中英

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

[英]Is this a bug in the Java regexp implementation?

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

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

请注意\\w已匹配_ 另外, | 在一个字符类中匹配一个文字| char, [a|b]匹配a| 或者b ,所以看来你应该删除| 来自你的第一个角色课。

使用

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

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

请参阅正则表达式演示 (因为模式与matches() ,因此需要完整的字符串匹配,我在正则表达式演示中添加了^$ )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM