Я создал шаблон регулярного выражения на 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.
Добавьте свой код в вопрос вместо изображения
Если вы используете if (m.find()) { ... }
без вызова .find()
перед этим, это должно работать, если ваше регулярное выражение соответствует строке.
На картинке лучше видно, но я ввожу код
Глядя на ваш снимок экрана, где он показывает 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_
Это происходит, даже если оно находится внутри синхронизированного метода?
синхронизированный метод здесь не имеет значения, так как все переменные, с которыми вы имеете дело, являются локальными внутри метода. Кроме того, для переоценки не требуется снова вызывать весь метод каким-либо другим потоком, поэтому, сохраняя синхронизацию метода, вы можете переоценивать выражение столько раз, сколько захотите.
Спасибо, сэр. Проблема, похоже, такая, как вы указали: «это означает, что оба не синхронизированы, и единственная причина, о которой я могу думать, это то, что вы находитесь в режиме отладки, и поскольку они у вас есть в окне выражения, m.find (), кажется, получает выполнялся несколько раз», «... Я сходил с ума, задаваясь вопросом, что не работает.
Да, я знаю, что это иногда случается, и это немного расстраивает :) Рад, что смог прояснить это.
Удалите ссылку на снимок экрана Eclipse и вместо этого включите весь соответствующий код Java непосредственно в вопрос.