루비는 모든 단어 첫 글자를 대문자로


162

모든 단어의 첫 문자를 대문자로하고 나머지는 소문자로 만들어야합니다 ...

manufacturer.MFA_BRAND.first.upcase

첫 글자를 대문자로만 설정하고 있지만 다음이 필요합니다.

ALFA ROMEO => Alfa Romeo
AUDI => Audi
BMW => Bmw
ONETWO THREE FOUR => Onetwo Three Four

답변:


217

이 시도:

puts 'one TWO three foUR'.split.map(&:capitalize).join(' ')

#=> One Two Three Four

또는

puts 'one TWO three foUR'.split.map(&:capitalize)*' '

7
split기본적으로 공간으로 분할되므로 더 짧게 만들 수 있습니다.'one TWO three foUR'.split.map(&:capitalize).join(' ')
Mischa

@ waltee 당신은 아마도 .map(&:capitalize)문서에서 그것을 찾은 곳을 적어도 설명 할 수 있습니까? 그것에 대한 참조를 찾을 수 없습니다. 또한 *' '두 번째 코드 스 니펫의 끝 부분에서 처리는 무엇 입니까?
macsplean

6
@macsplean &:method구문 은 배열의 각 항목에서 메소드를 호출map 하는 간결한 방법 입니다. 그런 다음 join해당 배열을 문자열로 변환하기 위해 호출 할 수 있습니다 . 는 * ' '입니다 가입 호출하는 또 다른 방법 . 배열의 항목을 곱하여 문자열을 만드는 것으로 생각할 수 있습니다.
앤드류

283

레일에서 :

"kirk douglas".titleize => "Kirk Douglas"
#this also works for 'kirk_douglas'

레일없이 :

"kirk douglas".split(/ |\_/).map(&:capitalize).join(" ")

#OBJECT IT OUT
def titleize(str)
  str.split(/ |\_/).map(&:capitalize).join(" ")
end

#OR MONKEY PATCH IT
class String  
  def titleize
    self.split(/ |\_/).map(&:capitalize).join(" ")
  end
end

Rails 없음 (#titleize 메소드를 패치하기 위해 Rails의 ActiveSupport로드 String)

require 'active_support/core_ext'
"kirk douglas".titleize #=> "Kirk Douglas"

#titleize가 처리하는 (일부) 문자열 사용 사례

  • "커크 더글러스"
  • "kirk_douglas"
  • "커크 두 글라스"
  • "커크 더글라스"
  • "커크 더글라스"

#titleize gotchas

Rails titleize는 대시 및 밑줄과 같은 것을 공백으로 변환하고 특히 @JamesMcMahon이 지적한 대소 문자 구분 상황에서 예기치 않은 다른 결과를 생성 할 수 있습니다.

"hEy lOok".titleize #=> "H Ey Lo Ok"

다음과 같은 낙타 케이스 코드를 처리하기 때문입니다.

"kirkDouglas".titleize #=> "Kirk Douglas"

이 경우를 처리하기 위해 #downcase#titleize를 실행하기 전에 먼저 문자열을 정리할 수 있습니다 . 물론 그렇게한다면 낙타에서 분리 된 단어를 지우 게됩니다 :

"kirkDouglas".downcase.titleize #=> "Kirkdouglas"

보석의도있다 titleize 잘 작동합니다.
zhon

6
예를 들어, 'hEy LoOK'는 'H Ey Lo Ok'가됩니다.
James McMahon

8
HUGE GOTCHA, titleize는 대시 (-)와 같은 특정 문자를 완전히 제거합니다. "who?-me".titleize => "Who? Me"
pixelearth

@pixelearth는 모든 대시를 개별 공간으로 변환합니다.
boulder_ruby

37

"hello world".titleize "Hello World"를 출력해야합니다.


이 경우이 출력 "One Two Three Fo Ur"은 원하는 출력과 다르지만 다른 출력에서는 바람직 할 수 있습니다.
Rick Smith

3
이것은 루비 방법이 아닙니다. 그것은 v2.2.1에 도입 된 ActiveSupport (레일) 방법입니다
잭 버트에게

20

또 다른 옵션은 정규 표현식과 gsub를 사용하는 것입니다.

'one TWO three foUR'.gsub(/\w+/, &:capitalize)

대시 등이 하나 개의 보존 간 단어
맥주 나

3
.gsub(/\b\w/, &:capitalize)보존 단어에서 대문자를 목적으로, 예를 들면 "제인 mcCollins"
user3680688


3
"hello world".split.each{|i| i.capitalize!}.join(' ')

1
변수를 다루지 않는다면 bang (!) 연산자를 사용할 이유가 없습니다.
boulder_ruby

2
@boulder_ruby "변수로 작업하지 않는다면 뱅 연산자를 사용할 이유가 없다"는 것은 사실 이 아닙니다. each블록 의 각 반복에 대한 리턴 값 이 삭제됩니다. 는 !에 의해 생성 된 문자열 수정되어 split제자리를. 포함하지 않는 !, capitalize그것을 폐기 즉시 다음 반복 당 하나의 새로운 대문자 문자열을 생성하고있을 것이다. 최종 결과는 "hello world"원래 문자열과 동일합니다. 을 사용하면 'd 배열 !의 각 문자열 split이 변경되므로 결과 each는 대문자 문자열의 배열입니다.
user513951

1
그래, 당신은 방금 사용해야 map합니다. 재미있는 해킹. 포인트
boulder_ruby

1

배열에서 각 단어의 첫 글자를 대문자로 사용하려는 경우 간단히 다음을 입력하십시오.

array_name.map (& : 자본)


0

비슷한 문제에 이것을 사용했습니다.

'catherine mc-nulty joséphina'.capitalize.gsub(/(\s+\w)/) { |stuff| stuff.upcase }

이것은 이전 답변을 시도한 다음과 같은 이상한 경우를 처리합니다.

  • 비 단어 문자-
  • é와 같은 이름에서 일반적으로 강조되는 문자
  • 문자열 중간에 대문자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.