确保字符串仅包含int或float

时间:2014-03-12 19:46:55

标签: ruby regex

如何在Ruby中编写REGEX以确保字符串仅为整数。例如

3 --> Returns true
3g --> Returns False
4.3 --> Returns False

同样,我如何编写REGEX以确保它是浮动的? 例如

3 --> Returns False
3g --> Returns False
4.3 --> Returns True

对于int和float我都需要REGEX。我认为对于浮点数它只是/ \ d + /和/\d+.\d+/但是不起作用。

4 个答案:

答案 0 :(得分:3)

正则表达式不是解决此问题的最佳方法。覆盖所有可能性的最简单方法是使用Kernel#Float尝试将字符串转换为Float,然后捕获异常:

def float?(str)
  !!Float(str)
rescue ArgumentError
  false
end

这将涵盖前导符号('+2.18'-3.14),忽略前导和尾随空格,甚至处理浮点数的科学记数法。仅使用Kernel#Float的一个漏洞是即使'NaN'Float,它也不会将Float::NAN.to_s == 'NaN'理解为'NaN',如果您想考虑Float成为def float?(str) str.strip == 'NaN' || !!Float(str) rescue ArgumentError false end 然后你可以这样做:

Float::INFINITY

同样适用于'Infinity' / -Float::INFINITY'-Infinity' / {{1}}。

如果你想分别检查整数,还有Kernel#Integer

答案 1 :(得分:1)

你想要一个匹配整数和浮点数的正则表达式吗?

/\A[-+]?\d+(\.\d+)?\z/

这匹配一系列数字(至少一个),可选地后跟一个点和另一系列数字。

答案 2 :(得分:0)

str = "111"
if(str =~ /^\d+$/)
    print "matched\n";
end

str = "4.3"
if(str =~ /^\d+\.\d+$/)
    print "matched\n";
end

答案 3 :(得分:0)

检查它是否为整数:

"3" !~ /\D/
"3g" !~ /\D/
"4.3" !~ /\D/

检查它是否浮动:

!!("3" =~ /\A\d+\.\d+\z/)
!!("3g" =~ /\A\d+\.\d+\z/)
!!("4.3" =~ /\A\d+\.\d+\z/)