2013-02-26 4 views
7
def titleize(string) 
    string.split(" ").map {|word| word.capitalize}.join(" ") 
end 

To tytułuje każde pojedyncze słowo, ale w jaki sposób przechwycić niektóre słowa, które nie powinny być pisane wielką literą?Ruby: Titleize: Jak zignorować mniejsze słowa, takie jak "i", "the", "lub, itp.

ie) Jack i Jill

I proszę nie używać Regex.

UPDATE:

Mam problemy podejmowania tej pracy Kod: mam go wydrukować tablicę słowy wszystkie czapki, ale nie bez listy poniżej.

words_no_cap = ["and", "or", "the", "over", "to", "the", "a", "but"] 

def titleize(string) 
cap_word = string.split(" ").map {|word| word.capitalize} 

cap_word.include?(words_no_cap) 

end 
+1

utworzyć tzw listę "stop-słowo", zawierające słowa, których nie chcesz przetwarzać. Może to być tablica, zestaw, hasz lub wyrażenie regularne. Regex jest popularnym sposobem radzenia sobie z problemem, jak jest hash, ponieważ oba są bardzo szybkie. Ponadto nie odmawiaj odpowiedzi mówiąc "NIE UŻYWAJ ...". Dostarczamy to, co uważamy za najlepsze rozwiązanie problemu i nie możesz ich wdrożyć. –

+0

możliwy duplikat [Używanie tytułu z Ruby 1.8.7] (http://stackoverflow.com/questions/13117340/using-title-case-with-ruby-1-8-7) – oldergod

+1

"NIE UŻYWAĆ Regex" brzmi kontrowersyjnie w podanym przykładzie kodu, ponieważ 'string.split' w rzeczywistości używa wyrażenia regularnego. Najprawdopodobniej chcesz coś już przygotowanego do użycia - spójrz na [titleize] (https://github.com/granth/titleize/blob/master/lib/titleize.rb). Może być zainstalowany jako klejnot. – mudasobwa

Odpowiedz

0

Jest to dość proste, wystarczy dodać warunek gdy dzwonisz captalize:

$nocaps = ['Jack', 'Jill'] 

def titleize(string) 
    string.split(" ").map {|word| word.capitalize unless $nocaps.include?(word)}.join(" ") 
end 

Zmienne globalne są wymyślone dla tego przykładu, to będzie prawdopodobnie zmienną instancji w rzeczywistej aplikacji.

+0

'if not' powinno być' unless '. Ale to spowolni dłużej listę 'nocaps' dostaje, ponieważ' include? 'Musi chodzić po tablicy sekwencyjnie. –

+0

@tinMan Dobry punkt, ale nie używam 'except', nawet w tej sytuacji. Ktoś najwyraźniej nie lubi tego rozwiązania; ale nie zostawili komentarza. –

6

Prawdopodobnie chcesz utworzyć rozszerzenie do funkcji existing titleize, którą zapewnia Rails.

Aby to zrobić, dołącz następujący plik do inicjalizatora i presto! Podaj wyjątki w locie lub opcjonalnie zmodyfikuj mój przykład, aby dodać wartości domyślne do inicjalizatora.

Zdaję sobie sprawę, że nie chciałeś używać Regex, ale hej, rzeczywista funkcja szyn używa Regex, więc równie dobrze możesz zachować synchronizację.

Umieść ten plik w Rails.root/lib/string_extension.rb i załaduj go do inicjalizatora; lub po prostu wrzuć go do samego inicjalizatora.

AKTUALIZACJA: zmodyfikowano REGEX w ten sposób dzięki sugestii @ svoop do dodania końcowej granicy słowa.

# encoding: utf-8 
class String 
    def titleize(options = {}) 
    exclusions = options[:exclude] 

    return ActiveSupport::Inflector.titleize(self) unless exclusions.present? 
    self.underscore.humanize.gsub(/\b(?<!['’`])(?!(#{exclusions.join('|')})\b)[a-z]/) { $&.capitalize } 
    end 
end 
3

Oto mój mały kod. Możesz refraktować go w kilka linii.

def titleize(str) 
    str.capitalize! # capitalize the first word in case it is part of the no words array 
    words_no_cap = ["and", "or", "the", "over", "to", "the", "a", "but"] 
    phrase = str.split(" ").map {|word| 
     if words_no_cap.include?(word) 
      word 
     else 
      word.capitalize 
     end 
    }.join(" ") # I replaced the "end" in "end.join(" ") with "}" because it wasn't working in Ruby 2.1.1 
    phrase # returns the phrase with all the excluded words 
end 
1

Odpowiedź @codenamev nie jest całkiem wykonywania pracy:

EXCLUSIONS = %w(a the and or to) 
"and the answer is all good".titleize(exclude: EXCLUSIONS) 
# => "And the Answer Is all Good" 
         ^^^ 

Wyłączenia powinny odpowiadać spływu granicy słowa. Oto ulepszona wersja:

# encoding: utf-8 
class String 
    def titleize(options = {}) 
    exclusions = options[:exclude] 

    return ActiveSupport::Inflector.titleize(self) unless exclusions.present? 
    self.underscore.humanize.gsub(/\b(['’`]?(?!(#{exclusions.join('|')})\b)[a-z])/) { $&.capitalize } 
    end 
end 

"and the answer is all good".titleize(exclude: EXCLUSIONS) 
# => "And the Answer Is All Good" 
         ^^^ 
3

Jeśli rzucisz to w config/inicjalizatory do nowego pliku (można nazwać to coś podobnego string.rb), można wywołać swoje funkcje niestandardowe do dowolnego ciągu znaków. Upewnij się, że uruchomiłeś ponownie, a następnie będziesz mógł uruchomić poniżej, np. "Anystring" .uncapitalize_puncs

Jest to łatwiejsze niż kłopotliwe próby zmiany domyślnego kodu titleize. Teraz możesz po prostu zadzwonić do @ something.title.titleize.uncapitalize_puncs

class String 

    def uncapitalize_puncs 
     puncs = ["and", "the", "to", "of", "by", "from", "or"] 
     array = self.split(" ") 
     array.map! do |x| 
      if puncs.include? x.downcase 
       x.downcase 
      else 
       x 
      end 
     end 
     return array.join(" ") 
    end 

end 
3

Jeśli chcesz, aby nie wykorzystać i czy, po prostu wykonaj następujące czynności:

def titleize(string) 
    nocaps = "and" 
    string.split(" ").map { |word| nocaps.include?(word) ? word : word.capitalize }.join(" ") 
end 
0

Niektóre tytuły mają przypadki krawędź (gra słów nie przeznaczonych), które mogą być potrzebne do rozważenia.

Na przykład małe słowa na początku tytułu lub po interpunkcji często powinny być pisane wielką literą (np. "Kroniki Narnii: Lew, Czarownica i Szafa", które mają obie).

Można również chcieć/trzeba wymusić małe słowa na małe litery, aby wejście takie jak "Jack And Jill" było renderowane jako "Jack and Jill".

Czasami może zajść potrzeba wykrycia, kiedy słowo (zazwyczaj nazwy firmowe) musi zachować niezwykłą wielkość liter, np. "iPod" lub akronimy np. "NATO" lub nazwy domen "example.com".

Aby prawidłowo obchodzić się z takimi przypadkami, klejnot titleize jest Twoim przyjacielem lub przynajmniej powinien stanowić podstawę kompletnego rozwiązania.

1

metodo wykorzystać ust Títulos

def capitalizar_titulo(string) 
    words_not_to_capitalize = ["a","e","i","o","u","ao","aos", "as", "nos","nós","no","na","mas", "mes", "da", "de", "di", "do", "das", "dos"] 
    s = string.split.each{|str| str.capitalize! unless words_not_to_capitalize.include? (str.downcase) } 
    s[0].capitalize + " " + s[1..-1].join(" ") 
    end 
+1

Witamy w Stack Overflow! Możesz przeczytać, jak odpowiedzieć na pytanie. SO to angielska strona. – Katie

0
titleize("the matrix or titanic") 

def titleize(string) 
    no_cap = ["and", "or", "the", "over", "to", "the", "a", "but"] 
    string.split(" ").map { |word| no_cap.include?(word) ? word : 
    word.capitalize }.join(" ") 
end 

wynik:

"the Matrix or Titanic" 
Powiązane problemy