Метод Java Regex find() не возвращает правильное значение

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

Если вы видите этот изображение, 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() является «истинным» (так, как показывает мне Eclipse), но он никогда не переходит во внутренний блок if, даже если я пытаюсь присвоить другое логическое значение.

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

Моя версия Java - 64-битный сервер "1.8.0_181".

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

Удалите ссылку на снимок экрана Eclipse и вместо этого включите весь соответствующий код Java непосредственно в вопрос.

Tim Biegeleisen 10.04.2019 12:49

Добавьте свой код в вопрос вместо изображения

IMParasharG 10.04.2019 12:50

Если вы используете if (m.find()) { ... } без вызова .find() перед этим, это должно работать, если ваше регулярное выражение соответствует строке.

Wiktor Stribiżew 10.04.2019 12:53

На картинке лучше видно, но я ввожу код

Xabier 10.04.2019 12:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
177
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на ваш снимок экрана, где он показывает 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_

Это происходит, даже если оно находится внутри синхронизированного метода?

Xabier 10.04.2019 13:20

синхронизированный метод здесь не имеет значения, так как все переменные, с которыми вы имеете дело, являются локальными внутри метода. Кроме того, для переоценки не требуется снова вызывать весь метод каким-либо другим потоком, поэтому, сохраняя синхронизацию метода, вы можете переоценивать выражение столько раз, сколько захотите.

Pushpesh Kumar Rajwanshi 10.04.2019 13:32

Спасибо, сэр. Проблема, похоже, такая, как вы указали: «это означает, что оба не синхронизированы, и единственная причина, о которой я могу думать, это то, что вы находитесь в режиме отладки, и поскольку они у вас есть в окне выражения, m.find (), кажется, получает выполнялся несколько раз», «... Я сходил с ума, задаваясь вопросом, что не работает.

Xabier 10.04.2019 13:47

Да, я знаю, что это иногда случается, и это немного расстраивает :) Рад, что смог прояснить это.

Pushpesh Kumar Rajwanshi 10.04.2019 15:00

Другие вопросы по теме