Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 匹配数字格式的正则表达式_Ruby_Regex - Fatal编程技术网

Ruby 匹配数字格式的正则表达式

Ruby 匹配数字格式的正则表达式,ruby,regex,Ruby,Regex,我正试图编写一个小程序,要求用户输入一个数字,程序将确定它是否是一个有效的数字。用户可以输入任何类型的数字(整数、浮点、科学记数法等) 我的问题是应该使用什么正则表达式来防止像“7w”这样的东西被匹配为有效数字?此外,我希望数字0退出循环并结束程序,但正如现在编写的那样,0与任何其他数字一样有效。有什么见解吗 x = 1 while x != 0 puts "Enter a string" num = gets if num.match(/\d+/) puts "Vali

我正试图编写一个小程序,要求用户输入一个数字,程序将确定它是否是一个有效的数字。用户可以输入任何类型的数字(整数、浮点、科学记数法等)

我的问题是应该使用什么正则表达式来防止像“7w”这样的东西被匹配为有效数字?此外,我希望数字0退出循环并结束程序,但正如现在编写的那样,0与任何其他数字一样有效。有什么见解吗

x = 1

while x != 0
  puts "Enter a string"
  num = gets

  if num.match(/\d+/)
    puts "Valid"
  else
    puts "invalid"
  end

  if num == 0
    puts "End of program"
    x = num
  end   
end

首先,循环过于复杂,其次,正则表达式需要更加显式。试着这样做:

x = 1

while x != 0
  puts "Enter a string"
  num = gets.chomp
  if num == "0"
    puts "exiting with 0"
    exit 0
  elsif num.match(/^[0-9](\.[0-9])?$+/)
    puts "Valid"
  else
    puts "invalid"
  end
end

此表达式将匹配任何包含数字或小数的数字,并且将无法匹配任何包含字母的数字。如果输入的字符串正好为0,脚本将以状态0退出。

您需要从命令行而不是文本编辑器执行此脚本,因为系统将提示您输入数字

这是超紧凑型的

def validate(n)
  if (Float(n) != nil rescue return :invalid)
    return :zero if n.to_f == 0
    return :valid
  end
end
print "Please enter a number: "
puts "#{num = gets.strip} is #{validate(num)}"
输出:

Please enter a number: 00
00 is zero
这里有一个较长的版本,您可能可以扩展它来调整它以满足您的需要

class String
  def numeric?
    Float(self) != nil rescue false
  end
end

def validate(n)
  if n.numeric?
    return :zero if n.to_f == 0
    return :valid
  else
    return :invalid
  end
end

print "Please enter a number: "
puts "#{num = gets.strip} is #{validate(num)}"
这是对所有可能情况的测试

test_cases = [
  "33", #int pos
  "+33", #int pos
  "-33", #int neg
  "1.22", #float pos
  "-1.22", #float neg
  "10e5", #scientific notation
  "X", #STRING not numeric
  "", #empty string
  "0", #zero
  "+0", #zero
  "-0", #zero
  "0.00000", #zero
  "+0.00000", #zero
  "-0.00000", #zero
  "-999999999999999999999995444444444444444444444444444444444444434567890.99", #big num
  "-1.2.3", #version number
  "  9  ", #trailing spaces
]

puts "\n** Test cases **"
test_cases.each do |n|
  puts "#{n} is #{validate(n)}"
end
哪些产出:

Please enter a number: 12.34
12.34 is valid

** Test cases ** 33 is valid
+33 is valid
-33 is valid
1.22 is valid
-1.22 is valid
10e5 is valid
X is invalid
 is invalid
0 is zero
+0 is zero
-0 is zero
0.00000 is zero
+0.00000 is zero
-0.00000 is zero
-999999999999999999999995444444444444444444444444444444444444434567890.99 is valid
-1.2.3 is invalid
   9   is valid
检查其数字是否正确的想法来源:


您希望接受的格式是什么?没有这一概念,就没有办法实施它。如果字符串正好是
“0\n”
,或
“\t\t 0\t\n”
“0.0\n”
等,是否要退出?如果是后者,则无法输入值
0
。货币符号呢?“etc”范围内还有什么?由@thebugfinder给出的答案应被视为最佳答案。尽管不是一个
regex
,但如果OP要求一个regex解决方案只是因为他们想要一个工具来完成这项工作,那么这个ruby惯用解决方案是最好的。(并且随着语言的发展,可能会看到最大的优化)谢谢!所以现在我试着加入负数。这是正确的表达式(^-[0-9])close吗,你想要/^-?[0-9]这样“-”是可选的,你可以使用它,但它会使它不适用于正数OK,所以我现在遇到的问题是它不会匹配任何超过小数点两位数的内容,例如“1.12”或“-1.12”,niether将匹配一个以小数点开头的数字。5“这是我为这个
/^-?[0-9]?(\.[0-9]+)?$+/
结束的完整正则表达式。我将第一个数字设置为可选,使其可以以“.”开头,并将第二个数字无限延伸。我验证了1.12、-1.12和.5都是有效的匹配项。好的,我找到的匹配项是/-?\d*(\.\d+)\ ^-?\d*(\.\d+)/两者之间有什么区别吗?