Ruby 클래스 작업 : 문자열 대문자 화

Sep 23 2020

저는 Ruby에서 Classes로 작업하는 방법에 대해 고심하고 있으며이 영역에 대한 통찰력을 높이고 싶습니다. 현재 저는 각 단어의 시작 부분이 대문자로 된 문자열을 변환하는 다소 간단한 작업이 있습니다. 예를 들면 :

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

답변

1 CarySwoveland Sep 23 2020 at 01:30

String인스턴스 메서드를 추가 하여 핵심 클래스를 오염시키지 않는 것이 좋습니다 . 대신 메서드에 인수를 추가하여 문자열을 보관하십시오. 다음과 같이 문자열을 축소 한 다음 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| )공백이 아닌 다른 문자가 일치에 선행하지 않는다는 것을 주장하는 부정적인 lookbehind 로 대체 될 수 있습니다 (?<![^ ]).

사용하여 해당 공지 사항 문자열 #의 GSUB를 합니다 (달리 정규 표현식으로 분할 -process- 가입 춤), 여분의 공백이 유지됩니다.

공백이 정규식에 의해 일치 될 때 종종 공백 ( \s)이 일치하는 것을 보게 됩니다. 예를 들어 여기에서는 /(?<=\A|\s)[a-z]/잘 작동하지만 공백과 일치하는 경우 주로 줄 바꿈 ( \n) (공백, 탭 및 기타 몇 가지 문자) 과도 일치하기 때문에 문제가 발생 합니다. 내 조언은 공백이 일치하는 경우 공백 문자를 일치시키는 것입니다. 탭도 일치해야하는 경우 문자 클래스 ( [ \t])를 사용하십시오.

1 Ayudh Sep 22 2020 at 22:33

시험:

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