2014-03-12 73 views
0

如何在Ruby中编写REGEX以确保字符串仅为整数。例如确保字符串只包含int或浮点数

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

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

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

我需要int和float的REGEX。我认为int只是/ \ d + /和/\d+.\d+/,但不起作用。

回答

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

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

很简单。谢谢。 :) – user3187131

+1

“-3.1415927”或“-11”呢? –

+0

另外,'3'也是一个有效的浮点数。 – BroiSatse

0

检查它是否是整数:

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

检查,如果它是浮动:

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

“-3.1415927”或“-11”是怎么回事? –

+0

@ muistooshort这需要考虑,但OP有一个正则表明负值不需要考虑。我认为。你是对的。但是OP没有明确。 – sawa

1

你想,这两个整数和浮点数匹配单个正则表达式?

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

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

+0

“-3.1415927”或“-11”是怎么回事? –

+0

@ muistooshort你是对的。我更新了正则表达式,因此如果数字前面带有减号,它也会匹配。 – Arjan

+0

我可能会用'[ - +]?','\ A'而不是'^'和'\ z'来代替'$'。当字符串包含换行符时,使用'^'和'$'可能会有令人惊讶的行为。 –

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'。如果你想单独检查整数,也有Kernel#Integer

+0

这是最强大的解决方案。 – sawa

相关问题