【问题标题】:How could I check to see if a word exists in a string, and return false if it doesn't, in ruby?我如何检查字符串中是否存在一个单词,如果不存在则返回 false,在 ruby​​ 中?
【发布时间】:2011-07-29 04:19:45
【问题描述】:

假设我有一个字符串str = "Things to do: eat and sleep."

如何检查 "do: " 是否存在于 str 中,不区分大小写?

【问题讨论】:

    标签: ruby regex string substring


    【解决方案1】:

    像这样:

    puts "yes" if str =~ /do:/i
    

    要返回一个布尔值(可能来自方法),请将匹配结果与nil 进行比较:

    def has_do(str)
        (str =~ /do:/i) != nil
    end
    

    或者,如果您不喜欢!= nil,那么您可以使用!~ 而不是=~ 并否定结果:

    def has_do(str)
        not str !~ /do:/i
    end
    

    但我不太喜欢双重否定……

    【讨论】:

    • 是否可以在 if 块中执行此操作?例如。 if str =~ /do: /i 将“是”结束
    • @oxo 当然可以。事实上,第一个代码只是它的简写。
    • 还有一个古老的 !! 技巧只得到一个布尔结果:>> !!(str =~ /do:/i) #=> true>> !!(str =~ /da:/i) #=> false
    • 为什么需要强制布尔值?在 Ruby 中,任何值都可以被视为真值;例如真/假。
    • @David 因为这就是 OP 想要的。当然,通常我会直接使用表达式(参见第一个示例)。但是由于 OP 明确提到了获取布尔值,我也展示了如何做到这一点。
    【解决方案2】:

    在 ruby​​ 1.9 中,您可以这样做:

    str.downcase.match("do: ") do   
      puts "yes" 
    end
    

    这不完全是您所要求的,但我注意到对另一个答案的评论。如果您在匹配字符串时不介意使用正则表达式,也许有一种方法可以跳过小写部分以不区分大小写。

    欲了解更多信息,请参阅String#match

    【讨论】:

    • “也许有一种方法可以跳过小写部分以不区分大小写”? str.match(/do: /i)
    • @theTinMan 哦,甚至在第一个答案中也是如此。下次需要好好思考=)
    • 如果您正在运行许多不区分大小写的正则表达式,可能将小写一次然后使用许多区分大小写的正则表达式会更有效。
    【解决方案3】:

    如果我正在寻找的只是我通常使用的不区分大小写的子字符串匹配:

    str.downcase['do: ']
    

    10 次中有 9 次我不在乎匹配在字符串中的哪个位置,所以这很好而且简洁。

    这是 IRB 中的样子:

    >> str = "Things to do: eat and sleep." #=> "Things to do: eat and sleep."
    >> str.downcase['do: '] #=> "do: "
    >> str.downcase['foobar'] #=> nil
    

    因为如果没有命中它会返回nil,它也适用于条件句。

    【讨论】:

      【解决方案4】:
      "Things to do: eat and sleep.".index(/do: /i)
      

      index 返回匹配开始的位置,如果没有找到则返回 nil

      您可以在此处了解有关索引方法的更多信息: http://ruby-doc.org/core/classes/String.html

      或者关于这里的正则表达式: http://www.regular-expressions.info/ruby.html

      【讨论】:

        【解决方案5】:

        你也可以这样做:

        str.downcase.include? "Some string".downcase
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-09
          • 2017-11-17
          • 1970-01-01
          • 2014-04-12
          • 2016-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多