Я выполняю сопоставление с образцом в фрагменте кода, который отлично работает в одном случае, но не работает в другом. В настоящее время код:
DLVRYrx = Pattern.compile("(\\d+\\s\\p{Letter}+\\s\\d+)\\s(\\d+(?:\\.\\d+)?)\\s(\\d+)");
Log.d(TAG, "* Regex matched " + DLVRYrx.matcher("01 Jan 01 60.9876 1234").groupCount() + " groups"); // prints 3 as expected in logcat
for (int i=19; i<(fields-6); i++) {
final String DATAstr = values[i];
try {
Matcher Dmatch = DLVRYrx.matcher(DATAstr);
String data1 = Dmatch.group(0);
} catch (IllegalStateException e) {
Log.e(TAG, "! Text ["+DATAstr+"] didn't match regex");
}
}
Код создает исключение IllegalStateException в строке Dmatch.group(0). Вывод строки logcat из улова: «01 января 01 60,9876 1234», как указано выше.
Выполнение шестнадцатеричного дампа в файле данных, который я читаю, показывает, что пробелы являются пробелами, как и ожидалось, и нет случайных символов до или после текста, который я сопоставляю. Любые предложения по отладке этого?
Я немного изменил код, чтобы проверить само выражение, и теперь я еще больше запутался. В цикле я сначала проверяю, соответствует ли строка шаблону, а затем запускаю ее через скомпилированную версию:
Pattern P = Pattern.compile(DLVRYrxStr);
if(!DATAstr.matches(DLVRYrxStr)) {
Log.e(TAG, "[" + DATAstr + "] doesn't match regex");
break;
}
Matcher Dmatch = P.matcher(DATAstr);
К сожалению (?) шаблон действительно совпадает и, таким образом, попадает в строку P.matcher, строка после которой выдает исключение, когда я пытаюсь прочитать первую совпадающую группу:
W/System.err( 1238): java.lang.IllegalStateException: No successful match so far
W/System.err( 1238): at java.util.regex.Matcher.ensureMatch(Matcher.java:607)
W/System.err( 1238): at java.util.regex.Matcher.group(Matcher.java:358)
Решение состоит в том, чтобы добавить проверку ".matches()", как показано ниже:
Matcher Dmatch = DLVRYrx.matcher(DATAstr);
Dmatch.matches();
String data1 = Dmatch.group(0);
Да, я использую это в операторе if в своем коде, но оставить его свободно висящим, как указано выше, работает нормально.