Trabalhando com a classe Ruby: Capitalizando uma string
Estou tentando entender como trabalhar com aulas de Ruby e gostaria muito de receber alguns insights sobre essa área. Atualmente, tenho uma tarefa bastante simples de converter uma string com o início de cada palavra em maiúsculas. Por exemplo:
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"
Este é o meu código atualmente:
class String
def toJadenCase
split
capitalize
end
end
#=> usual case: split.map(&:capitalize).join(' ')
Resultado:
Expected: "The Moment That Truth Is Organized It Becomes A Lie.",
instead got: "The moment that truth is organized it becomes a lie."
Respostas
Eu sugiro que você não polua a Stringclasse principal com a adição de um método de instância. Em vez disso, basta adicionar um argumento ao método para conter a string. Você pode fazer isso da seguinte maneira, diminuindo o tamanho da string e usando gsubcom uma expressão regular.
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."
O mecanismo regex do Ruby executa as seguintes operações.
(?<=\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| )pode ser substituído pelo lookbehind negativo (?<![^ ]) , que afirma que a correspondência não é precedida por um caractere diferente de um espaço.
Observe que, usando String # gsub com uma expressão regular (ao contrário da dança split -process- join ), os espaços extras são preservados.
Quando os espaços devem ser correspondidos por uma expressão regular, geralmente vemos os espaços em branco ( \s) correspondidos. Aqui, por exemplo, /(?<=\A|\s)[a-z]/funciona bem, mas às vezes a correspondência de espaços em branco leva a problemas, principalmente porque eles também correspondem a novas linhas ( \n) (bem como espaços, tabulações e alguns outros caracteres). Meu conselho é combinar os caracteres de espaço se os espaços devem ser combinados. Se as guias devem ser correspondidas também, use uma classe de caractere ( [ \t]).
Tentar:
def toJadenCase
self.split.map(&:capitalize).join(' ')
end