我已经编写了一个正则表达式来匹配任何数字:
- 阳性和阴性
- 小数
- 实数
下面的正则表达式做得很好,但有一个缺点
([+-]{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/
测试的一些值的示例