正则表达式在单个组中从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+))