Java中用于实数的好正则表达式是什么?

4

什么是Java中适用于实数的正则表达式?

我创建了正则表达式([-]?[\\d]*\\.[\\d]*),并对以下预期输出进行了测试:

in                  out        works?
--------------------------------------
qwerty34.34abcd     34.34       yes
qwe-34.34.34abcd    -34.34      no
+17.-9abc           17.0        yes
-.abc0              0.0         no

我需要准确提取列(out)中的内容。 请提供一个正则表达式,使其通过所有这些测试。


2
为什么第二行没有被认为是有效的? - Sergey Kalinichenko
1
但是,-34.34.34是一个无效的实数,也许! - AllTooSir
1
-34.34 是在 -34.34.34 中寻找实数的正则表达式的正确输出。因为 -34.34.34 不是一个实数。同样的道理也适用于您的最后一个例子。 - Ant P
但在第二个测试中,出现了NumberFormatException: multiple points! 我无法将其转换为-34.34。 - Vanya
1e+100是什么意思? - Robert
显示剩余2条评论
5个回答

7

请尝试以下方法:

((\+|-)?([0-9]+)(\.[0-9]+)?)|((\+|-)?\.?[0-9]+)

这将匹配实数,包括整数,带或不带符号(以及小数点前是否有数字)。


问题出在你的正则表达式上。你的正则表达式没有匹配到后者,所以它会跳过去匹配“34”。现在不清楚应该匹配“34”还是“.34”。 - nhahtdh
@AntP:你的正则表达式接受 +.55.55,这很可能会被 OP 拒绝。 - nhahtdh
(请注意,他要求“真实数字”,而不是“有效的浮点值”) - Ant P
表达式((\+|-)?([0-9]+)(\.[0-9]+)?)|((\+|-)?\.?[0-9]+)不适用于'qwe-34.34.34abcd'。 - Vanya
@Vanya - 它匹配了-34.34,这是字符串中第一个有效的实数... - Ant P
显示剩余4条评论

4
正则表达式必须满足以下要求:
  1. 可能有一个可选符号,尝试使用[+-]?
  2. 可能有零个或多个可选数字,尝试使用[0-9]*
  3. 可能有一个小数点,尝试使用[.]以避免反斜杠问题。
  4. 小数点后可能有零个或多个数字。尝试使用[0-9]*
  5. 第2点和第4点至少有一项有一个数字。这将使用[0-9]+,并且它可以使用交替。
这个模式是否有效:[+-]?([0-9]*[.]?[0-9]+|[0-9]+[.]?[0-9]*)? 但是,我们担心会出现灾难性回溯。

2
下一个怎么样?
^-?(([1-9][0-9]*)|(0))(?:\.[0-9]+)?$

如果您想允许 “+” 符号,则可以选择下一个选项:
^(-|\+)?(([1-9][0-9]*)|(0))(?:\.[0-9]+)?$

顺便说一下,这个网站可以用来测试和分享正则表达式,非常实用。


2
^[+-]?(?:\d+\.?\d*|\d*\.\d+)$
  • ? 用于使 +- 变成可选项
  • ?: 用于非捕获组
  • \ 是转义字符

0

或者这个: [0-9]+\.[0-9]*([eE][\+\-]?[0-9]+)?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接