评估字符串检查是否为整数



我试图只输出这个数组中的整数值。

perms=["12+2*4","2+2","-2+","12+34-","12-3/4"]
perms.each do |line|
    if (line.to_s =~ /^d+(?:[+/*-]d+)*$/)
        puts "#{line}"
        if(!(eval(line).to_s=~ /Ad+z/))
            puts "#{line}=#{eval(line)}"
        end
    end

我得到:

12+2*4
2+2
12-3/4

而不是我所期望的:

12+2*4
12+2*4=20
2+2
2+2=4

(12-3/4 的计算结果不是整数,因此不应包含在此处)

如果

=~ 运算符与正则表达式不匹配,则返回 nil。如果它找到匹配项,则返回找到的匹配项的偏移量。正因为如此,你要么期待nil,要么期待integer。您的第二个 if 语句否定了匹配返回的内容。如果你否定nil你会得到true但如果你否定一个整数,你会得到false。这意味着你的逻辑是倒退的。通过添加针对nil的检查,逻辑将按预期工作。

perms=["12+2*4","2+2","-2+","12+34-","12-3/4"]
perms.each do |line|
    if (line.to_s =~ /^d+(?:[+/*-]d+)*$/)
        puts "#{line}"
        if(!(eval(line).to_s =~ /Ad+z/).nil?)
            puts "#{line}=#{eval(line)}"
        end
    end
end

有了这种理解,您甚至可以完全删除否定操作以达到相同的结果。为了配合这一点,你可以将其存储在变量中,而不是eval(line)两次,尽管这更多的是关于偏好。

perms=["12+2*4","2+2","-2+","12+34-","12-3/4"]
perms.each do |line|
    if (line.to_s =~ /^d+(?:[+/*-]d+)*$/)
        puts "#{line}"
        result = eval(line)
        if(result.to_s =~ /Ad+z/)
            puts "#{line}=#{result}"
        end
    end
end

最新更新