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