【问题标题】:Using a Regular Expressions as a conditional loop (until)使用正则表达式作为条件循环(直到)
【发布时间】:2011-10-17 01:43:36
【问题描述】:

我正在尝试使用正则表达式作为(直到)循环内的条件。 基本上,它是用于输入数字密码..

我试过这段代码

   print "Password: "
   x = gets.chomp.to_i
   until (/^[\d]+(\.[\d]+){0,1}$/ === "#{x}") == "true"
      print "Only numbers allowed, Password: "
      x = gets.chomp.to_i
   end

但不幸的是它没有工作。

有什么想法吗?

【问题讨论】:

  • 我把标题中的“[Ruby]”去掉了,放在标签里就够了。

标签: ruby regex loops conditional


【解决方案1】:

这当然行不通。 === ("triqual") 是等效的 "Is of the same class as"。所以你在那里做的是询问Ruby是否

 (a class of this regex is the same as the class of the string) equals string "true"

在这种情况下,内部比较是拙劣的,并且从一开始就永远不会起作用(Regexp 和字符串永远不会属于同一类),外部比较也永远不会起作用(Ruby 没有像 ECMAscript 的 @987654323 这样的魔术字符串常量@)。

对于 Ruby 中的条件,记住这一点很方便:任何表达式的计算结果不是 nilfalse 都将为真!所以正则表达式匹配运算符会做得很好(当没有找到匹配项时返回nil,这就是您要查找的内容,以及找到匹配项时的偏移量 - 并且Ruby中的任何整数都是“真实的” , 甚至 0)。

确实如此,

print "Password: "
x = gets.chomp

until /^[\d]+$/ =~ x
  print "Only numbers allowed, Password: "
  x = gets.chomp
end

pw =x.to_i

【讨论】:

  • 所以这意味着 ruby​​ 中的任何条件都是在它为真时实现的,即使它不是在相等的情况下.. 对吗?非常感谢这些宝贵的信息。特别是对于像我这样的 24 小时老红宝石开发人员..
【解决方案2】:

您不应该与字符串 "true" 进行比较。事实上,在 Ruby 中,您几乎不需要显式地与 truefalse 进行比较,因为这就是布尔表达式的计算结果。另请注意,to_i 可能不符合您的预期:

"adsfasf34".to_i #=> 0
"1adsfasf34".to_i #=> 1

你可以这样做:

print "Password: "
until (x = gets.chomp) =~ /^[\d]+(\.[\d]+){0,1}$/
  print "Only numbers allowed, Password: "
end
x = x.to_i

【讨论】:

  • 你写的更快更简洁了,我删了:)
  • 我想问一下,现在的条件是否意味着“继续打印直到 X 匹配模式..等等”会说英语吗?
  • 是的,循环将读取“直到 x(您通过 gets.chomp 获得)匹配 (=~) 正则表达式 (/.../) 打印语句。
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
相关资源
最近更新 更多