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

#java #regex #matcher

#java #регулярное выражение #сопоставитель

Вопрос:

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

Если вы видите это изображение, Eclipse выдает мне значение true при выполнении 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 — 64-разрядный сервер «1.8.0_181».

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

Комментарии:

1. Пожалуйста, удалите ссылку на захват экрана Eclipse и вместо этого включите весь соответствующий Java-код непосредственно в вопрос.

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

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

4. На изображении вы увидите лучше, но я добавляю код

Ответ №1:

Глядя на ваш скриншот, где он показывает m.find() as true и то же значение, присвоенное isMatch переменной to be false , что означает, что оба они не синхронизированы, и единственная причина, о которой я могу думать, заключается в том, что, поскольку вы находитесь в режиме отладки и поскольку у вас есть они в окне выражения, m.find() кажется, выполняется несколько раз, гдев первый раз значение m.find() должно было быть true , но когда оно было выполнено снова, в следующий раз оно не соответствовало данным и 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_
  

Комментарии:

1. Происходит ли это, даже если оно находится внутри синхронизированного метода?

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

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

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