如何从字符串java中提取双精度或整数

时间:2014-12-27 21:07:47

标签: java regex string

我正在编写这段代码,用户输入一个包含数字的字符串,例如

H3.07LLo my nam3 is bob12

输出应为

3.07, 3.0, 12.0

我设法得到一个正则表达式来寻找双打,但我不知道如何查找整数。这是我的正则表达式:

(-)?(([^\\d])(0)|[1-9][0-9]*)(.)([0-9]+)

我对正则表达式很新。我尝试添加|[0-9]|,但无论我把它放在我当前的正则表达式中,我一直在搞乱它

3 个答案:

答案 0 :(得分:3)

您可以使用:

(-?[0-9]+(?:[,.][0-9]+)?)

说明:

NODE                       EXPLANATION
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    -?                     '-' (optional (matching the most amount
                           possible))
--------------------------------------------------------------------------------
    [0-9]+                 any character of: '0' to '9' (1 or more
                           times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
    (?:                    group, but do not capture (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
      [,.]                 any character of: ',', '.'
--------------------------------------------------------------------------------
      [0-9]+               any character of: '0' to '9' (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
    )?                     end of grouping
--------------------------------------------------------------------------------
  )                        end of \1

DEMO

答案 1 :(得分:2)

你可以通过用空格替换非数字字符,修剪然后分割空间来在一行中完成。

String[] numbers = str.replaceAll("[^0-9.]+", " ").trim().split(" ");

它为您提供输入的数字部分。如果你真的需要双打:

double[] ds = new double[numbers.length];
for (int i = 0; i < numbers.length; i++) { 
    ds[i] = Double.parseDouble(numbers[i]);
}

对于一些java 8的乐趣,整个事情可以在一行中完成!

double[] nums = Arrays.stream(str.replaceAll("[^0-9.]+", " ").trim().split(" ")).mapToDouble(Double::parseDouble).toArray();

答案 2 :(得分:1)

正则表达式中存在一个问题,即使用点(.)字符来匹配文字点。点字符是正则表达式术语中与任何字符匹配的特殊符号。为了只匹配小数点.,您需要使用\.转义它。

要匹配整数,您可以使用问号符号将包含小数点和小数位的组设为可选。除非您对模式进行分组,否则也不需要括号。所以你的正则表达式可能只是-?(\d+)(\.\d+)?

String input = "H3.07LLo my nam3 is bob12";
Pattern pattern = Pattern.compile("-?\\d+(\\.\\d+)?");
Matcher matcher = pattern.matcher(input);
while(matcher.find()) {
    System.out.println(Double.valueOf(matcher.group()));
}

<强>输出:

3.07
3.0
12.0