评估Ruby正则表达式和变量

时间:2012-10-24 12:06:00

标签: ruby regex variables

这似乎是一个奇怪的问题。我有一些带有输入字符串的Ruby代码,使用scanflatten来提取特定值,然后希望在if...then中操作该值声明,但我遇到了问题。

我的输入字符串描述了该区域中“危险生物”的数量。当描述没有危险的生物或两个或更多生物时,该弦总是标准的,如:

“该地区没有危险的生物”或“一个危险的生物......”等等。

我正在使用它来获取表示生物数量的单词:“no”,“one”,“two”等等,希望稍后将这些转换为数值 - “no”= 0 ,“一”= 1,等等。

为此,我使用:

crittercount = strcheck.scan(/a*(no|one|two|three|four|five|six|seven|eight|nine|ten)a*/)

然后我去变量if then做一个crittercount说:

if crittercount == "no"
  critters = 0
  ... exit and go do something with the var...
end

我为每个人这样做。 (当我发现这个问题时,我将使用if..elsif..end

if crittercount == "one"
  critters = 1
  ... exit and go do something with the var...
end
...

crittercount == "ten"之后我只使用

if crittercount == "ten"
  critters = 10
else
  critters = 99
end

问题在于:我有一个名为maxcreatures的变量等于10。我采用strcheck值“该地区没有危险的生物”,例如,我打印出它返回的确切字符串的值。然后我打印出crittercount变量,在这个例子中,我得到“不”。

当我通过我的if..then..语句时,我会评估使用方法:

if critters > maxcreatures
  print "Maximum Creatures " + critters.to_s + " and maximum is #{maxcreatures}.  Lets Bail"
else
  print "Critter count " + critters.to_s  + " is less than #{maxcritters} Keep going."
end

在每种情况下我都会99,我发誓我已经尝试了一切。我尝试在正则表达式的末尾使用.flatten,我尝试在.strip var上使用crittercount。我希望有人看着这个,然后去试试吧。“

根据要求这里是所有代码,这里有调用其他功能可能没有意义...

maxcritters = 2

critters = 0


put "count critter"
strcheck = matchfind "You notice ?"

crittercount = strcheck.scan(/a*(no|one|two|three|four|five|six|seven|eight|nine|ten)a*/)
echo strcheck
echo crittercount
crittercount = crittercount.strip
if crittercount == "no"
    critters = 0
    goto "roundup"
end
if crittercount  == "one"
    critters = 1
    goto "roundup"
end
if crittercount == "two"
    critters = 2
    goto "roundup"
end
if crittercount == "three"
    critters = 3
    goto "roundup"
end
if crittercount == "four"
    critters = 4
    goto "roundup"
end
if crittercount == "five"
    critters = 5
    goto "roundup"
end
if crittercount == "six"
    critters = 6
    goto "roundup"
end
if crittercount == "seven"
    critters = 7
else
critters = 99
end

roundup:
if critters > maxcritters
echo "Maximum Creatures " + critters.to_s + " and maximum is #{maxcritters}.  Lets Bail"
critters == nil
fput "retreat"

else
    echo "Critter count " + critters.to_s  + " is below maximum of #{maxcritters} - We're cool.  Keep going."
    critters == nil
    goto "combatcheck"
end

4 个答案:

答案 0 :(得分:1)

当您可能期望多个匹配时,

scan非常有用。由于您只希望每个字符串匹配一次,所以不应该使用它。

以下内容将直接为您提供critters。你不需要所有这些条件。

regex = /(\bno\b)|(\bone\b)|(\btwo\b)|(\bthree\b)|(\bfour\b)|(\bfive\b)
            |(\bsix\b)|(\bseven\b)|(\beight\b)|(\bnine\b)|(\bten\b)/x

critters = strcheck.match(regex).to_a.drop(1).index{|x| x} || 99

答案 1 :(得分:0)

问题是crittercount是一个数组,而不是一个字符串。因此,if crittercount == "no"等永远不会true,您将始终在最后else内结束。

解决方案是将您的代码更改为:

crittercount = strcheck.scan(/no|one|two|three|four|five|six|seven|eight|nine|ten/).first

这个crittercount将是一个字符串或nil,其余代码将按预期工作。

答案 2 :(得分:0)

看起来你正在做...如果...结束如果......结束而不是......如果... elsif..elsif ...结束

因此,对于10以外的任何值,您将最终进入其他块

if crittercount == "ten"
  critters = 10
else
  critters = 99
end

案例陈述在这里会更好......

case (crittercount)
    when "no" then critters = 0
    when "one" then critters = 1
    when "two" then critters = 2
    when "three" then critters = 3
    when "four" then critters = 4
    when "five" then critters = 5
    when "six" then critters = 6
    when "seven" then critters = 7
    when "eight" then critters = 8
    when "nine" then critters = 9
    when "ten" then critters = 10
    else critters = 99
end

或者更好的是,如果查找失败,则对所有默认为99的数字进行哈希查找。

numberHash = { "no" => 0, "one" => 1, "two" => 2, "three" => 3, "four" => 4, "five" => 5, "six" => 6, "seven" => 7, "eight" => 8, "nine" => 9, "ten" => 10 }
numberHash.default = 99
critters = numberHash[critterCount]

答案 3 :(得分:0)

scan返回一个数组,包含匹配数据和数组,所以在你的代码中,如果你调用.first.first,你会得到第一个匹配。你也可以这样做

strcheck = "two dangerous creatures in the area" # or "one dangerous creature...'
strcheck =~ (/(.*) dangerous.*/)
critters = case $1 
  when 'no' then 0
  when 'one' then 1
  when 'two' then 2
  when 'three' then 3
  when 'four' then 4
  when 'five' then 5
  when 'six' then 6
  when 'seven' then 7
  else 99 
end
puts "number of critters #{critters}"

使用案例清理逻辑,只需使用正则表达式匹配并提取第一个匹配