Ваш Pattern
не соответствует вашим требованиям.
Вот то, что ваши Pattern
анализируют прямо сейчас:
| literal dot
| | followed by any 1+ sequence reluctantly quantified
| | | followed by non-capturing 1 or 2
| | |
\\..+?(?=0|1)
По определению, не захватывающие конструкции не могут иметь обратную ссылку (т.е. вы никогда не сможете получить их значения, вызвав Matcher#group
).
А вот простой пример того, что вы хотите вместо этого:
String test = "this is a test 123. 1";
// | group 1: any 1+ char sequence reluctantly quantified,
// | | followed by a dot, non-capturing here
// | |
// | | | any character reluctantly quantified
// | | | (here, your whitespace)
// | | | | group 2: 1 or 2
Pattern p = Pattern.compile("(.+?)(?=\\.).*?([01])");
Matcher m = p.matcher(test);
if (m.find()) {
System.out.printf("Group 1: %s%nGroup 2: %s%n", m.group(1), m.group(2));
}
Вывод
Group 1: this is a test 123
Group 2: 1
Примечания
- Группа
0
всегда представляет весь матч. - Другими словами, определяемые пользователем нумерованные группы (определяемые содержимым, заключенным в скобки в шаблоне) начинаются с индекса
1
. См. Группы и захват раздел здесь .
Кажется, ваши требования для разбора окончательной цифры 0
/ 1
немного слабоваты.Возможно, вы захотите спросить себя, будет ли эта цифра «изолированной», например, окружена линией, отличной от букв, или, возможно, частью большой последовательности цифр и т. Д. И т. Д.