regex 正则表达式匹配任何数字(真实的、有理数沿着符号)

kognpnkq  于 2023-04-22  发布在  其他
关注(0)|答案(4)|浏览(122)

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

  • 积极和消极
  • 十进制
  • 真实的

下面的正则表达式做得很好,但有一个缺点

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

对于**+-**等输入也是正的。任何指针都将非常感谢。谢谢。
regex应该使用以下输入
5、+5、-5、0.5、+0.5、-0.5、.5、+.5、-.5
并且不应匹配以下输入
+

+.
-.
.

这里是tchrist的答案,完美的作品。

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

qf9go6mv1#

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

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

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

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

n3ipq98p

n3ipq98p2#

您需要至少一个数字,即使用+而不是*作为\d
我认为您也可以在几个地方删除{1},因为默认情况下这是隐含的。
类似地,{0,1}可以在后跟?时被丢弃
为我们提供:

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

htrmnn0y3#

我想应该是这样的:

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

编辑:
我已经改进了它,所以它不会匹配-123.上的点,但它会匹配123.456
编辑2:
所以它不只是匹配+或-,你可以检查这样的符号必须在一个点或一个数字之前,点是可选的。

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

rbpvctlc4#

这个简单的表达式在我使用Python时很有效:

相关问题