如何在Ruby中检查单词的第一个和最后一个字符是否相同?

时间:2018-12-19 15:39:33

标签: ruby string

如果我有一个句子字符串,我想检查每个单词的第一个和最后一个字母是否相同,并找出哪个单词的第一个和最后一个字母相同。例如:

def count_pairs(t):
    if len(t) == 0:
        return ()
    elif t[0] % 2 == 0:
        return 1 + count_pairs(t[1:])
    else:
        return count_pairs(t[1:])

6 个答案:

答案 0 :(得分:4)

您可以使用正则表达式:

sentence_one = "Label the bib numbers in red"

sentence_one.scan(/(\b(\w)\w*(\2)\b)/i)
#=> [["Label", "L", "l"], ["bib", "b", "b"]]

\b是一个单词边界,\w与一个字母匹配(您可能需要对此进行调整)。有3个捕获项:(1)整个单词,(2)第一个字母,(3)最后一个字母。使用\2要求最后一个字母与第一个字母匹配。

答案 1 :(得分:1)

这将打印出所有以相同字母开头和结尾(不区分大小写)的单词

sentence_one = "Label the bib numbers in red"
words = sentence_one.split(' ')

words.each do |word|
  if word[0].downcase == word[-1].downcase
    puts word
  end
end

答案 2 :(得分:1)

在评论中,OP询问如何获得具有所需属性的单词数。这是一种方法。我假设期望的属性是单词的第一个和最后一个字符相同,尽管可能大小写不同。这是一种不产生将要计算其元素的中间数组的方法。

r = /
    \b            # match a word break
    (?:           # begin a non-capture group
      \p{Alpha}   # match a letter
      |           # or
      (\p{Alpha}) # match a letter in capture group 1
      \p{Alpha}*  # match zero or more letters
      \1          # match the contents of capture group 1
    )             # end the non-capture group
    \b            # match a word break
    /ix           # case-indifferent and free-spacing regex definition modes

str = "How, now is that a brown cow?"

str.gsub(r).count
  #=> 2

请参见String#gsub,尤其是在只有一个参数且没有提供块的情况下。

注意

str.gsub(r).to_a
  #=> ["that", "a"]

str.scan(r)
  #=> [["t"], [nil]]

有时,当正则表达式包含捕获组时,请使用scan(请参阅String#scan)。通常可以通过使用gsub后接to_a(或Enumerable#entries)来避免这些问题。

答案 3 :(得分:1)

sentence_one.scan(/\S+/).select{|s| s[0].downcase == s[-1].downcase}
# => ["Label", "bib"]

答案 4 :(得分:0)

sentence_one = "Label the bib numbers in red"
puts sentence_one.split(' ').count{|word| word[0] == word[-1]} # => 1

答案 5 :(得分:0)

只需添加一个选项即可拆分成多个数组(跳过一个字母):

sentence_one =  "Label the bib numbers in a red color"

sentence_one.split(' ').keep_if{ |w| w.end_with?(w[0].downcase) & (w.size > 1) }

#=> ["Label", "bib"]