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]+))|))

如果你想要一个看起来像C浮点的东西,下面是如何使用CPAN:中的Regexp::Common模块,让Perl写出一个能做到这一点的正则表达式

$ 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]+))|))

文档显示,它可以为您吐出的数字模式的完整可能语法是:

$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中使用这些模式。

享受吧。

您需要至少一个数字,即对d使用+而不是*

我认为你也可以在几个地方删除{1},因为这是默认所暗示的

类似地,{0,1}可以在后面跟着? 时丢弃

给我们:

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

我认为应该这样做:

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

编辑:

我已经改进了它,所以它不会与-123.上的点匹配,但它会用于123.456

第2版:

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

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

这个简单的表达式对我使用Python:很有用

-?\d+(.\d+)?

您可以使用进行测试https://regex101.com/

测试的一些值的示例

最新更新