Java: как разобрать double из регулярных выражений - PullRequest
17 голосов
/ 10 сентября 2010

У меня есть строка, которая выглядит как "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»

РЕДАКТИРОВАТЬ: я также хотел бы соответствовать C, если у него нет десятичной точки: так что я хотел бы захватить 3567, а также3.567

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

Ответы [ 4 ]

34 голосов
/ 10 сентября 2010

Возможно, я ошибаюсь в этой части, но причина, по которой он разделяет эти два, заключается в том, что 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]+)?")

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

6 голосов
/ 10 сентября 2010

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

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

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

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

2 голосов
/ 17 февраля 2015

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

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

Удачи.

2 голосов
/ 10 сентября 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...