#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. Да, я знаю, что это иногда случается, и это немного расстраивает 🙂 Рад, что я смог уточнить это.