匹配正则表达式与数值和小数

时间:2016-04-29 19:52:02

标签: ruby regex

我需要将正则表达式与带小数的数值匹配。目前我有/ ^ - ?[0-9] \ d *(。\ d +)/但它不占.00 我该如何解决?

当前有效:

1
1.0 
1.33
.00

当前无效:

Alpha Character 

7 个答案:

答案 0 :(得分:5)

您需要处理两种可能性(没有小数部分的数字和没有整数部分的数字):

/\A-?(?:\d+(?:\.\d*)?|\.\d+)\z/
#^   ^  ^            ^^     ^---- end of the string
#|   |  |            |'---- without integer part
#|   |  |            '---- OR
#|   |  '---- with an optional decimal part
#|   '---- non-capturing group
#'---- start of the string

或全部选择并确保至少有一位数字:

/\A-?+(?=.??\d)\d*\.?\d*\z/
#  ^  ^  ^        ^---- optional dot
#  |  |  '---- optional char (non-greedy)
#  |  '---- lookahead assertion: means "this position is followed by"
#  '---- optional "-" (possessive)

注意:我之所以使用非贪婪量词??只是因为我认为带整数部分的数字更频繁,但它可能是错误的假设。在这种情况下,将其更改为贪心量词?(无论你使用哪种量词来表示“unknow char”都没关系,这不会改变结果。)

答案 1 :(得分:1)

如果第一部分是可选的,你可以用`(?:...)?:

标记它
/\A(?:-?[0-9]\d*)?(.\d+)/

?:开头意味着这是一个非捕获组,因此它不会干扰您试图阻止的部分。

答案 2 :(得分:1)

简单来说:/\d*\.?\d*/

答案 3 :(得分:0)

使用要匹配的变体创建正则表达式,在本例中为3:

N
N.NN
.NN

即:

(\d+\.\d+|\d+|\.\d+)

regex 101 Demo

答案 4 :(得分:0)

如果您想捕获该行的特定部分,我会使用^\-?[0-9\.]+(^\-?[0-9\.]+)之类的内容。这会在一行的开头查找数字09和小数点(.)的任意组合,其中选项以短划线开头({{1 }})。

我还强烈推荐网站Rubular作为测试和使用正则表达式的好地方。

答案 5 :(得分:0)

这是一种不同的方法。

def match_it(str)
  str if str.gsub(/[\d\.-]/, '').empty? && Float(str) rescue nil
end

match_it "1"     #=> "1" 
match_it "1.0"   #=> "1.0" 
match_it "-1.0"  #=> "-1.0" 
match_it "1.33"  #=> "1.33" 
match_it ".00"   #=> ".00" 
match_it "-.00"  #=> "-.00" 
match_it "1.1e3" #=> nil 
match_it "Hi!"   #=> nil 

答案 6 :(得分:0)

这可能会有所帮助。 :

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

试试吧:)