Java: как разобрать double из regex

У меня есть строка, которая выглядит как "A = 1.23; B = 2.345; C = 3.567"

Меня интересует только "C = 3.567"

что я до сих пор:

     Matcher m = Pattern.compile("C=\\d+.\\d+").matcher("A=1.23;B=2.345;C=3.567");

    while(m.find()){ 
        double d = Double.parseDouble(m.group());
        System.out.println(d);
    }

проблема заключается в том, что она показывает 3 как отдельно от 567

выход:

3,0

567,0

Мне интересно, как я могу включить десятичное число, чтобы он выводил "3.567"

EDIT: я также хотел бы сопоставить C, если он не имеет десятичной точки: поэтому я хотел бы захватить 3567, а также 3.567

так как C = встроен в шаблон, как я могу его разбить, прежде чем разбирать двойной?

Ответы

Ответ 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]+)?")

У этого есть поддержка необязательного знака, либо необязательного целого числа, либо необязательных десятичных частей, и необязательных положительных/отрицательных показателей. Вставляйте группы захвата, где необходимо выбирать детали по отдельности. Показатель в целом входит в свою группу, чтобы сделать его в целом необязательным.

Ответ 2

Ваше регулярное выражение соответствует только числовым символам. Чтобы также совместить десятичную точку, вам понадобится:

Pattern.compile("\\d+\\.\\d+")

. экранируется, потому что это будет соответствовать любому символу, когда он не отображается.

Примечание: это будет соответствовать только числам с десятичной точкой, что и есть в вашем примере.

Ответ 3

Чтобы соответствовать любой последовательности цифр и точек, вы можете изменить регулярное выражение на это:

"(?<=C=)[.\\d]+"

Если вы хотите быть уверенным, что существует только одна точка, вы можете попробовать что-то вроде этого:

"(?<=C=)\\d+(?:\\.\\d+)?"

Вы также должны знать, что этот шаблон может соответствовать 1.2 в ABC=1.2.3;. Вы должны подумать, нужно ли улучшить регулярное выражение для правильной обработки этой ситуации.

Ответ 4

если вам нужно проверить десятичное число с точками, запятыми, положительными и отрицательными значениями:

Object testObject = "-1.5";
boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,][0-9]+$", (CharSequence) testObject);

Удачи.