【问题标题】:How to extract doubles or integers from a string java如何从字符串java中提取双精度或整数
【发布时间】:2014-12-27 21:07:47
【问题描述】:

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

H3.07LLo my nam3 is bob12

输出应该是

3.07, 3.0, 12.0

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

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

我对正则表达式很陌生。我尝试添加|[0-9]|,但无论我把它放在我当前的正则表达式中的任何地方,我都会继续搞砸它

【问题讨论】:

标签: java regex string


【解决方案1】:

你可以在一行中用空格替换非数字字符,修剪然后在空格上分割。

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();

【讨论】:

  • 如果文本是123.21.212.554aaaaa5怎么办? numbers 将是 ["123.21.212.554", "5"]
  • 很好的观察,我会说在这种情况下你只需过滤掉任何超过一个点的结果。我喜欢这种简单的方法,即使它确实存在上面提到的一个问题。
  • 另外,您应该使用正确的Locale 来解析以. 作为小数分隔符的双精度数,否则它仅适用于那些使用. 作为分隔符的语言环境。 (使用法语语言环境,你会发现它不起作用)。
  • @BackSlash 是的,但是对于任何解决方案,您建议如何处理此类输入?例如,“123.456.7”是否应该被解析为“123.4”和“56.7”“123.4”和“56.7”?我认为这样的输入是“坏”的输入,除非有一个关于如何解释相邻数字的明确定义,这在问题中没有提到或暗示。
  • @BackSlash 很好地了解了语言环境,但这可以由编码人员添加。这只是一个基本的实现。
【解决方案2】:

你可以使用:

(-?[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

【讨论】:

  • 正在使用任何工具生成此文档?
  • @kamoor This way
  • 我刚刚尝试过它并且它有效,但我不确定你是如何通过该正则表达式使整数变成双精度的。您如何将 .0 添加到整数?
  • 很棒的工具。谢谢
  • @user3323950 该模式将抓取整数(左部分),如果这些数字后面跟着一个点和更多数字,它也会抓取那些会给出小数的数字......最后一部分是可选提示 ? 的使用,表示 0 或 1 次
【解决方案3】:

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

要匹配整数,您可以使用问号符号将由小数点和小数位组成的组设为可选。除非您对模式进行分组,否则也不需要括号。所以你的正则表达式可能只是-?(\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

【讨论】:

  • 感谢您的信息。我需要整数是双精度数,所以我需要 3.07、3.0、12.0 等,但我不知道如何通过正则表达式添加它们
猜你喜欢
  • 2013-02-26
  • 2022-11-21
  • 2016-08-19
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
相关资源
最近更新 更多