Ruby语句 - 不区分大小写?

时间:2014-05-19 17:24:09

标签: ruby regex boolean case-insensitive nomethoderror

我有一个问题,我试图创建一个方法来查找字符串中的单词(或字符序列)并且不关心区分大小写。例如," ExAmPLE"和"示例"都会回归真实。这是我的代码

class WordMethods
  # Finds words in a string and returns true or false
  def word_finder?(string, word) # A boolean method that takes in one argument, word (a string)
    return true if string.include?(word, /i/) # trying to use regex for case insensitive
  end
word_finder?("A gold brown fox", "GoLD") # should return true
end

当我在irb上运行代码时,我收到以下错误。

NoMethodError: undefined method `word_finder?' for WordMethods:Class

我不明白。我在类中定义了我的方法,然后在类中调用它。我不知道自己哪里出错了。我是ruby的初学者,并练习了一些我在互联网上找到的示例问题。这是其中之一。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:3)

您可以在Ruby中使用正则表达式来搜索字符串中的某些内容,并通过将i添加到正则表达式的末尾来使您的搜索不区分大小写,如下所示:

"A gold brown fox" =~ /GoLD/i    #=> 2

返回2,这是匹配的索引。如果没有匹配,则返回nil。这适用于布尔上下文,因为值2的作用类似于" true"在Ruby中,而nil充当" false。"当然,如果你真的希望它返回truefalse,你可以在表达式前加!!来强制它为布尔值:

!!("A gold brown fox" =~ /GoLD/i)   #=> true

这种语法很简单,但是如果你想创建一个word_finder?方法,你可以这样做:

class String
  def word_finder?(word)
    !!(self =~ Regexp.new(word, true))
  end
end

"A gold brown fox".word_finder?("GoLD")    #=> true

上述代码需要注意三点:

  1. 我们正在修补String类,添加word_finder?方法。通过在字符串后添加.word_finder?来调用此方法,并且字符串的值在函数中表示为self

  2. 通过Regexp.new(word, true)创建Regexp模式会返回该字的不区分大小写的正则表达式。因此,在这种情况下,Regexp.new("GoLD", true)评估为/GoLD/i

  3. 我们将self =~ Regexp.new(word, true)括在!!( ... )中,以便我们获得truefalse,而不是匹配的索引或nil。< / p>

  4. 参考:
    http://www.regular-expressions.info/ruby.html
    http://www.ruby-doc.org/core-2.1.1/Regexp.html#method-c-new
    http://www.ruby-doc.org/core-2.1.2/String.html#method-i-3D-7E