2014-05-09 34 views
2

我只是試圖將大寫的公司名稱轉換爲專有名稱。在Ruby on Rails中使用羅馬數字,破折號,撇號等標題化

公司名稱可以包含:

  1. 破折號
  2. 撇號
  3. 羅馬數字
  4. 文字像LLC,LP,INC應該留大寫。

我想我可能可以使用首字母縮寫詞是這樣的:

ACRONYMS = %W(LP III IV VI VII VIII IX GI) 
ActiveSupport::Inflector.inflections(:en) do |inflect| 
    ACRONYMS.each { |a| inflect.acronym(a) } 
end 

但是,轉換不會考慮斷字,所以有VIVII不起作用。例如,「ADVISORS」.titleize的轉換爲「Ad VI Sors」,因爲VI變成了一個完整的單詞。

虛線被刪除。

似乎應該有一個通用的寶石這個一般問題,但我沒有找到一個。這個問題真的不常見嗎?除了徹底破解當前的變形庫之外,最好的解決方案是什麼?

+0

剛剛偶然發現,因爲我正在通過相同的問題。如前所述,將VI設置爲首字母縮寫確實會導致「ADVISORS」分裂,但只有當詞語全部大寫時,我才發現它。小寫「顧問」沒有得到相同的處理。既然你最終得到稱號,你可以在titleize之前調用downcase,並按照你的期望獲得「Advisors」,而VI本身仍然會按照你的期望結束所有上限。 – Yardboy

回答

3

公司名稱有點奇怪,因爲很多時候它們都是標記(如服務標記),而不是專有名稱。這意味着精確的資本化可能實際上很重要,試圖標題化可能不值得。

無論如何,這裏有一個可能的模式。將您的令牌列表「保留」,然後手動分割字符串並標記非令牌部分。

# Make sure you put long strings before short (VII before VI) 
word_tokens = %w{VII VI IX XI} 
# Special characters need to be separate, since they never appear as "part" of another word 
special_tokens = %w{-} 
# Builds a regex like /(\bVII\b|\bVI\b|-|)/ that wraps "word tokens" in a word boundary check 
token_regex = /(#{word_tokens.map{|t| /\b#{t}\b/}.join("|")}|#{special_tokens.join("|")})/ 
title = "ADVISORS-XI" 
title.split(token_regex).map{|s| s =~ token_regex ? s : s.titleize}.join 
+0

VI和像ADVISORS-XI這樣的名字呢?我認爲可能的解決方案是將公司名稱拆分爲單詞,然後調用titleize,然後放回到一起,但記住拆分字符。 – justingordon

+0

是的,這就是代碼所做的。您需要添加任何不應標記爲標記正則表達式的字符串(例如,IX)。 –

+0

我會稍後嘗試一下代碼,但是閱讀它後,似乎VI作爲代幣將ADVISORS分解爲AD,VI,SORS,然後標題AD和Sors將成爲AdVISors。也許第一次分裂成詞... – justingordon