Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式在单个组中从java字符串中查找整数或小数?_Java_Regex - Fatal编程技术网

正则表达式在单个组中从java字符串中查找整数或小数?

正则表达式在单个组中从java字符串中查找整数或小数?,java,regex,Java,Regex,我正在尝试此示例字符串上的(\d+\d+\.\d+): Oats 124 0.99 V 1.65 但当我在Java中使用模式匹配器类时,它给了我不同组中的十进制数 我希望我的答案在一组中。整数和浮点数不需要单独的模式。只需将小数部分设置为可选部分,就可以从单个组中获得两种类型的数字 (\d+(?:\.\d+)?) 使用上述模式并从组索引1中获取数字 代码: String s = "Oats 124 0.99 V 1.65";

我正在尝试此示例字符串上的
(\d+\d+\.\d+)

Oats     124   0.99        V    1.65
但当我在Java中使用模式匹配器类时,它给了我不同组中的十进制数


我希望我的答案在一组中。

整数和浮点数不需要单独的模式。只需将小数部分设置为可选部分,就可以从单个组中获得两种类型的数字

(\d+(?:\.\d+)?)
使用上述模式并从组索引1中获取数字

代码:

String s = "Oats     124   0.99        V    1.65";
Pattern regex = Pattern.compile("(\\d+(?:\\.\\d+)?)");
 Matcher matcher = regex.matcher(s);
 while(matcher.find()){
        System.out.println(matcher.group(1));
}
124
0.99
1.65
输出:

String s = "Oats     124   0.99        V    1.65";
Pattern regex = Pattern.compile("(\\d+(?:\\.\\d+)?)");
 Matcher matcher = regex.matcher(s);
 while(matcher.find()){
        System.out.println(matcher.group(1));
}
124
0.99
1.65
图案说明:

String s = "Oats     124   0.99        V    1.65";
Pattern regex = Pattern.compile("(\\d+(?:\\.\\d+)?)");
 Matcher matcher = regex.matcher(s);
 while(matcher.find()){
        System.out.println(matcher.group(1));
}
124
0.99
1.65
  • ()
  • \d+
    匹配一个或多个数字
  • (?:)
  • (?:\。\d+)
    匹配一个点和以下一个或多个数字<代码>?在非捕获组之后,将整个非捕获组作为可选组

只有更改模式的顺序,正则表达式才能工作

(\d+\.\d+|\d+)

这个问题并不完全清楚,但我看到的第一个问题是。是正则表达式中的魔法字符,表示任何字符。你需要用as来逃避它。例如,有很多regex备忘单

尝试以下模式:

\d+(?:\.\d+)?

Edit:
\d+ match 1 or more digit
(?: non capturing group (optional)
   \. '.' character
   \d+ 1 or more digit
)?  Close non capturing group 

请张贴实际代码。谢谢。@Adam我在上面提到的输入上使用(\d+\d+.\d+)作为我的正则表达式。请粘贴您所期望的输出。请阅读…
\d+\d+。\d+
将无法按您的要求工作,因为在正则表达式尝试测试字符串是否与
\d+.\d+
匹配之前,它将首先测试
\d+
。这是因为图案从左到右变红(从左到右的部分优先于从右的部分)。同样的规则适用于
foo | foo
regex。它将永远无法匹配
foo
,因为
foo
的前两个字符将由
fo
匹配。要解决此问题,您可以将
)参数(子区域)的顺序更改为第一个匹配
\d+\.\d+
的参数,如果
\d+
,请尝试使用
\d+\.\d+\d+
。这很有效。谢谢你能用简单的英语详细解释一下为什么这个有效而其他无效吗?它只返回一个整数,不带前导0就可以捕获一个double吗?i、 e.“0.99”而不是0.99?是的,为什么不呢<代码>(?要解析负数,可以使用(-?\\d+(?:\\.\\d+))