Java Regex метод find () не возвращает правильное значение - PullRequest
0 голосов
/ 10 апреля 2019

Я создал шаблон регулярного выражения в Java и, по-видимому, класс matcher находит его в строке, но он не возвращает правильное значение.

Если вы видите это image , Eclipse дает мне «истинное» значение, когда я выполняю метод m.find(), но он не присваивает его должным образом переменной isMatch.

То же самое происходит, когда я пишу "if (m.find()), это не идет во внутренний блок.

Пример кода:

{

    private final static String REGEX_PATTERN_FILE_GROUP = "(\\d{14}_\\d{9}_\\D{3}_\\d{11}_)";

    for (File file: fileList) {
        Pattern p = Pattern.compile(REGEX_PATTERN_FILE_GROUP);  
        Matcher m = p.matcher(file.getName());              
        if (m.find())
        {   
           .... More code ...
        }

}

Пример значения file.getName (): "1.0- 20190409095211_200522007_CNA_20180000959_1_xxxxx.pdf"

Очевидно, что m.find () имеет значение true (так как Eclipse показывает меня),но он никогда не переходит во внутренний блок if, если я пытаюсь присвоить другое логическое значение.

Протестировано в https://regex101.com/ и получено значение.

Моя версия Java - "1.8.0_181 "64-разрядный сервер.

Я новичок в StackOverflow, Java и Eclipse.

1 Ответ

0 голосов
/ 10 апреля 2019

Посмотрите на ваш скриншот, где он показывает m.find() как true и одно и то же значение, присвоенное isMatch переменной, равной false, означая, что оба не синхронизированы, и единственная причина, о которой я могу думать, это , поскольку вы находитесь в режиме отладки и поскольку они есть в окне выражений, m.find(), кажется, выполняется несколько раз, где значение m.find() в первый раз должно быть истинным, но, как только оно будет выполнено снова, в следующий раз оно не соответствовало данным, и значение m.find()'s стало false, и в конечном итоге оно было присвоено переменной isMatch.

Попробуйте избавиться от режима отладки и просто запустите код, и значение переменной isMatch должно быть синхронизировано и должно соответствовать ожиданиям. Или вы можете даже просто отключить окно выражений во время отладки кода, и отладка должна дать вам правильные значения, как и ожидалось. Убедитесь, что вы не переоценили m.find(), иначе ваша программа даст вам неожиданные результаты.

Кроме того, никогда не обращайтесь к .group() методам, если только значение, возвращаемое m.find() или m.matches(), не равно true

Для меня ваш код работает нормально, как ожидалось, и печатает true.

String REGEX_PATTERN_FILE_GROUP = "(\\d{14}_\\d{9}_\\D{3}_\\d{11}_)";

String s = "1.0- 20190409095211_200522007_CNA_20180000959_1_xxxxx.pdf";
Pattern p = Pattern.compile(REGEX_PATTERN_FILE_GROUP);
Matcher m = p.matcher(s);
boolean isMatch = m.find();
System.out.println("isMatch: " + isMatch);
if (isMatch) {
    System.out.println(m.group());
}

печать

isMatch: true
20190409095211_200522007_CNA_20180000959_
...