Вы ожидаете, что это каким-то образом вырвет отдельные числа, потому что именно так вы их подбираете, но это не сработает.То, что делает ваше регулярное выражение, захватывает одно число за раз и помещает его в группу # 1.Это происходит десять раз, каждый раз перезаписывая содержимое группы # 1 новым значением.Когда это будет сделано, group()
вернет всю строку, как вы обнаружили, в то время как group(1)
вернет только десятое число, 68.641
.
Это распространенная ошибка, вероятно, из-за отсутствия встроенного Java-в механизме "найти все совпадения"..NET имеет свои Matches()
методы, PHP имеет preg_match_all()
, Python имеет re.findall()
, Perl и JavaScript имеют модификатор /g
... каждый основной вариант имеет механизм для возврата либо массива всех совпадений, либо итератораза спичками или обоими.Но в Java вы должны вызывать find()
в цикле while
, как продемонстрировал @KennyTM.
Это досадное упущение, но не совсем удивительное для Java.Его эффект заключается в том, чтобы заставить нас писать более многословный, менее идиоматический код, который с самого начала был отличительной чертой Java.Но если вы действительно хотите свести эту задачу к одной строке, есть старый трюк «разбить на части»:
String[] result = source.split("(?=\\B\\d{2}\\.\\d{3})");
... или:
String[] result = source.split("(?<=\\G\\d{2}\\.\\d{3})");