我需要将正则表达式与带小数的数值匹配。目前我有/ ^ - ?[0-9] \ d *(。\ d +)/但它不占.00 我该如何解决?
当前有效:
1
1.0
1.33
.00
当前无效:
Alpha Character
答案 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)
答案 4 :(得分:0)
如果您想捕获该行的特定部分,我会使用^\-?[0-9\.]+
或(^\-?[0-9\.]+)
之类的内容。这会在一行的开头查找数字0
到9
和小数点(.
)的任意组合,其中选项以短划线开头({{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+]*)
试试吧:)