Это ошибка в реализации регулярного выражения Java? - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь сопоставить строку 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()));
     }
}

Я использую:

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)

1 Ответ

0 голосов
/ 26 октября 2018

Шаблон содержит вложенные квантификаторы.\w+ находится внутри группы, которая сама количественно определяется с помощью +, что затрудняет обработчику регулярных выражений обработку несоответствующих строк.Имеет больше смысла выделять класс символов из группы чередования, т.е. (\\w+|_|\\.|-)+ => [\\w.-]+.

Обратите внимание, что \w уже соответствует _.Кроме того, | внутри класса символов соответствует буквальному символу |, а [a|b] соответствует a, | или b, поэтому, похоже, вам следует удалить | из вашего первого класса символов.

Использование

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

Обратите внимание, что вы можете использовать группу без захвата ((?:...)) вместо группы захвата, чтобы избежать ненужных дополнительных затрат, поскольку вы просто проверяетедля поиска и не извлечения подстрок.

См. демо regex (поскольку шаблон используется с matches() и, следовательно, требует полного соответствия строк, я добавил ^ и $ в регулярном выражении демо).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...