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

rko*_*egi 10 java regex

我正在尝试将字符串iso_schematron_skeleton_for_xslt1.xsl与正则表达式匹配([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()));
     }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用:

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)
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 9

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

请注意,\w已经匹配_.此外,|字符类内部匹配文字|字符,并[a|b]匹配a,|或者b,因此您似乎应该|从第一个字符类中删除它.

使用

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

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

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