Возможно, я ошибаюсь в этой части, но причина, по которой он разделяет эти два, заключается в том, что group () будет соответствовать только последней согласованной подпоследовательности, которая соответствует любому совпадению при каждом вызове find () . Спасибо, Марк Байерс.
Конечно, вы можете решить эту проблему, поместив всю нужную деталь в «группу захвата», что делается в скобках. Это позволяет сгруппировать совпадающие части вашего регулярного выражения в одну подстроку. Ваш шаблон будет выглядеть так:
Pattern.compile("C=(\\d+\\.\\d+)")
Для анализа 3567 или 3.567 ваш шаблон будет C=(\\d+(\\.\\d+)?)
с группой 1, представляющей целое число. Кроме того, обратите внимание, что, поскольку вы специально хотите сопоставить точку, вы хотите экранировать свой символ .
(точка), чтобы он не интерпретировался как маркер «любой символ». Для этого ввода, однако, это не имеет значения
Затем, чтобы получить 3,567, вы бы позвонили m. group (1) , чтобы получить первую (считая от 1) указанную группу. Это будет означать, что ваш вызов Double.parseDouble по существу станет Double.parseDouble("3.567")
Что касается удаления C = из вашего паттерна, так как я не очень хорошо разбираюсь в RegExp, я мог бы рекомендовать вам split вашу входную строку на точки с запятой, а затем проверить, чтобы увидеть если каждый из разделений содержит C; тогда вы можете применить шаблон (с группами захвата), чтобы получить 3.567 от вашего Matcher.
Редактировать Для более общих (и, вероятно, более полезных!) Случаев в комментарии Гави, пожалуйста, используйте следующее (из http://www.regular -expressions.info / floatpoint.html )
Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")
Имеется поддержка необязательного знака, необязательного целого числа или необязательных десятичных частей и необязательных положительных / отрицательных показателей. Вставьте группы захвата, где это необходимо, чтобы выбрать части по отдельности. Экспонент в целом находится в своей собственной группе, что делает его в целом необязательным.