Arbeiten mit der Ruby-Klasse: Großschreibung eines Strings

Sep 23 2020

Ich versuche, mich mit der Arbeit mit Klassen in Ruby vertraut zu machen, und würde mich über einen Einblick in diesen Bereich sehr freuen. Derzeit habe ich eine ziemlich einfache Aufgabe, eine Zeichenfolge mit dem Anfang jedes großgeschriebenen Wortes zu konvertieren. Beispielsweise:

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"

Dies ist derzeit mein Code:

class String
  def toJadenCase
    split
    capitalize

  end
end

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


Ausgabe:

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

Antworten

1 CarySwoveland Sep 23 2020 at 01:30

Ich schlage vor, dass Sie die Kernklasse nicht Stringdurch Hinzufügen einer Instanzmethode verschmutzen . Fügen Sie stattdessen einfach ein Argument zur Methode hinzu, um die Zeichenfolge zu halten. Sie können dies wie folgt tun, indem Sie die Zeichenfolge verkleinern und dann gsubmit einem regulären Ausdruck verwenden.

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."

Rubys Regex-Engine führt die folgenden Vorgänge aus.

(?<=\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| )kann durch das negative Lookbehind ersetzt werden (?<![^ ]) , das besagt , dass der Übereinstimmung kein anderes Zeichen als ein Leerzeichen vorausgeht.

Beachten Sie, dass durch die Verwendung von String # gsub mit einem regulären Ausdruck (im Gegensatz zum Split- Process- Join- Tanz) zusätzliche Leerzeichen erhalten bleiben.

Wenn Leerzeichen durch einen regulären Ausdruck \sabgeglichen werden sollen, werden stattdessen häufig Whitespaces ( ) abgeglichen. Hier /(?<=\A|\s)[a-z]/funktioniert das zum Beispiel einwandfrei, aber manchmal führt das Abgleichen von Leerzeichen zu Problemen, hauptsächlich weil sie auch mit Zeilenumbrüchen ( \n) (sowie Leerzeichen, Tabulatoren und einigen anderen Zeichen) übereinstimmen . Mein Rat ist, Leerzeichen zuzuordnen, wenn Leerzeichen übereinstimmen sollen. Wenn auch Registerkarten übereinstimmen sollen, verwenden Sie eine Zeichenklasse ( [ \t]).

1 Ayudh Sep 22 2020 at 22:33

Versuchen:

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