使用 Ruby class:大写字符串

Working with Ruby class: Capitalizing a string

我正在努力了解如何在 Ruby 中使用 类,非常感谢您对此领域的一些见解。目前,我有一个相当简单的任务来转换一个字符串,每个单词的开头都大写。例如:

Not Jaden-Cased: "How can mirrors be real if our eyes aren't real"
Jaden-Cased:     "How Can Mirrors Be Real If Our Eyes Aren't Real"

这是我目前的代码:

class String
  def toJadenCase
    split
    capitalize

  end
end

#=> usual case: split.map(&:capitalize).join(' ')


输出:

Expected: "The Moment That Truth Is Organized It Becomes A Lie.",
 instead got: "The moment that truth is organized it becomes a lie."

尝试:

 def toJadenCase
    self.split.map(&:capitalize).join(' ')
 end

我建议你不要通过添加实例方法来污染核心 String class。相反,只需向方法添加一个参数来保存字符串。您可以按如下方式执行此操作,方法是将字符串缩小,然后将 gsub 与正则表达式一起使用。

def to_jaden_case(str)
  str.downcase.gsub(/(?<=\A| )[a-z]/) { |c| c.upcase } 
end
to_jaden_case "The moMent      That trUth is organized, it becomes a lie."
  #=> "The Moment      That Truth Is Organized, It Becomes A Lie."

Ruby 的正则表达式引擎执行以下操作。

(?<=\A| )  : use a positive lookbehind to assert that the following match
             is immediately preceded by the start of the string or a space 
[a-z]      : match a lowercase letter

(?<=\A| ) 可以替换为 negative lookbehind (?<![^ ]),它断言匹配前面没有 [=41 以外的字符=].

请注意,通过将 String#gsub 与正则表达式一起使用(不同于 split-process-join dance),额外space 已保留。

当要用正则表达式匹配 spaces 时,通常会看到白色 spaces (\s) 被匹配。例如,这里 /(?<=\A|\s)[a-z]/ 工作正常,但有时匹配 whitespaces 会导致问题,主要是因为它们也匹配换行符(\n)(以及 spaces 、制表符和其他一些字符)。我的建议是如果要匹配 space 个字符,则匹配 space 个字符。如果还要匹配制表符,请使用字符 class ([ \t]).