ruby .gsub替换/替换特定范围的索引

时间:2015-02-22 05:57:51

标签: ruby arrays string gsub substitution

Ruby新手在这里。我正试图创建一种能够纠正'电影的标题。这些方法应该正确地大写,忽略大写文章(a,an,the,of),除非在开始时,即使所给出的标题都是大写或混乱,也应该正确地纠正。当我想在字符串(1..100)中指定一定范围的索引来查找文章并将其更改为小写时,我会陷入困境。我的代码的前半部分运行得很好,但是后半部分修改了一系列索引.join是我遇到麻烦的地方。如果可以使用.gsub或'如果' " .join"之后的陈述这对我的理解水平来说是最好的建议。我希望我能清楚。任何帮助/输入表示赞赏。谢谢

class Title
  attr_accessor :title
  def initialize(title)
    @title = title
  end

  def fix
    new_array = []
    @title.split.each do |word|
      new_array << "#{word}".capitalize
    end
    new_array.join(" ")
      new_array(1..100).gsub("Of","of").gsub("The","the").gsub("And","and")
    end
  end
end

交替:

class Title
  attr_accessor :title
  def initialize(title)
    @title = title
  end

  def fix
    new_array = []
    @title.split.each do |word|
      new_array << "#{word}".capitalize
    end
    new_array.join(" ")
    if new_array(1..100) then
      new_array.gsub("Of","of").gsub("The","the").gsub("And","and")
    end
  end
end

这是规格

describe "Title" do
  describe "fix" do
    it "capitalizes the first letter of each word" do
      expect( Title.new("the great gatsby").fix ).to eq("The Great Gatsby")
    end
    it "works for words with mixed cases" do
      expect( Title.new("liTTle reD Riding hOOD").fix ).to eq("Little Red Riding Hood")
    end
    it "downcases articles" do
      expect( Title.new("The lord of the rings").fix ).to eq("The Lord of the Rings")
      expect( Title.new("The sword And The stone").fix ).to eq("The Sword and the Stone")
      expect( Title.new("the portrait of a lady").fix ).to eq("The Portrait of a Lady")
    end
    it "works for strings with all uppercase characters" do
      expect( Title.new("THE SWORD AND THE STONE").fix ).to eq("The Sword and the Stone")
    end
  end
end

2 个答案:

答案 0 :(得分:1)

像这样使用String#slice:

string[0..99]

使用示例:

string = "Everything"
string[5..8]
=> "thin"

Ruby也有很好的方法来实现你的目标:

stopwords = %w{ a an and but in of on or the }.to_set
title.capitalize.split.map{|word| 
  stopwords.include?(word) ? word : word.capitalize
}.join(" ")

答案 1 :(得分:1)

这是解决问题的一种方法。我想建议一个替代方案来考虑。您正在寻求将标题中任何文章的实例大写,除非该实例位于标题的开头。您可以使用.each_with_index处理其中的第二部分。对于第一部分,您可以创建目标单词的数组,然后在目标数组中搜索单词,如下所示:

def fix
  articles = ["a", "and", "the", "of"]

  word_array = title.downcase.split(" ")
  new_array = []

  word_array.each_with_index do |word, index|
    if index == 0 || !articles.include?(word)
      new_array << word.capitalize
    else
      new_array << word
    end
  end
  new_array.join(" ")
end

所以.downcase会“标准化”你的标题,所以所有单词都是小写的。 .split(" ")会将你的字符串变成一个单词数组(在每个空格处切割)。然后,您将使用.each_with_index访问该数组的每个元素。此方法使您可以访问元素和索引。然后,您可以检查您是否处于索引0或否定此特定元素是否为文章。 .includes?检查传递给它的参数是否是被调用的数组的元素。它会根据是否返回truefalse。在它之前有!,我们否定结果(将true变为false而false变为true)因为我们只关心单词是否在数组中。最后,我们调用`.join(“”)来传递一个字符串,用预期的空格分隔每个单词。