正则表达式匹配任何数字(真实,理性和符号)

时间:2012-02-18 13:42:30

标签: java regex

我写了一个正则表达式来匹配任何数字:

  • 正面和负面
  • 十进制
  • 真实数字

以下正则表达式表现不错,但有一个缺点

([\+\-]{1}){0,1}?[\d]*(\.{1})?[\\d]*

对于 + - 等输入也是正面的。任何指针将不胜感激。感谢。

正则表达式应该使用以下输入

5,+ 5,-5,0.5,+ 0.5,-0.5,.5,+ 5,-.5

并且不应与以下输入匹配

+

-

+

-

以下是tchrist的回答,完美无缺。

(?:(?i)(?:[+-]?)(?:(?=[.]?[0-9])(?:[0-9]*)(?:(?:[.])(?:[0-9]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[0-9]+))|))

3 个答案:

答案 0 :(得分:5)

如果你想要一个看起来像C浮点数的东西,下面是如何利用Regexp::Common module from CPAN哼哼Perl咳出一个正则表达式,使用documentation

$ perl -MRegexp::Common -le 'print $RE{num}{real}'
(?:(?i)(?:[+-]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[0123456789]+))|))

如果你愿意,你可以稍微调整一下,但这可以为你提供基本的想法。

它非常灵活。例如,这会为基数为2的实数吐出一个模式,每三个位置允许使用逗号:

$ perl -MRegexp::Common -le 'print $RE{num}{real}{-base => 2}{-sep => ","}{-group => 3}'
(?:(?i)(?:[+-]?)(?:(?=[.]?[01])(?:[01]{1,3}(?:(?:[,])[01]{3})*)(?:(?:[.])(?:[01]{0,}))?)(?:(?:[E])(?:(?:[+-]?)(?:[01]+))|))

{{3}}表明它可以为您吐出的数字模式的完整可能语法是:

$RE{num}{int}{-base}{-sep}{-group}{-places} 
$RE{num}{real}{-base}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{dec}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{oct}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{bin}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{hex}{-radix}{-places}{-sep}{-group}{-expon} 
$RE{num}{decimal}{-base}{-radix}{-places}{-sep}{-group} 
$RE{num}{square} 
$RE{num}{roman}

让它真正为您想要的任何东西定制它。是的,当然你可以在Java中使用这些模式。

享受。

答案 1 :(得分:3)

您需要至少一位数字,即+使用*代替\d

我认为你也可以将{1}放在几个地方,因为这是默认隐含的

同样,{0,1}

后可以删除?

给我们:

regex = "[+-]?(\\d+|\\d*\\.?\\d+)";

答案 2 :(得分:1)

我认为应该这样做:

[+-]?\d*(\.\d+)?

编辑:

我已对其进行了改进,因此它与-123.上的点不匹配,但会与123.456

相匹配

EDIT2:

所以它只与+或 - 不匹配,你可以检查这样的符号必须在点或数字之前,这个点是可选的。

[+-]?(?=[\.?\d])\d*(\.\d+)?