我只是想将大写的公司名称转换为专有名称。
公司名称可包括:
我以为我可以使用这样的首字母缩略词:
ACRONYMS = %W( LP III IV VI VII VIII IX GI)
ActiveSupport::Inflector.inflections(:en) do |inflect|
ACRONYMS.each { |a| inflect.acronym(a) }
end
但是,转换不考虑分词,因此VI
和VII
不起作用。例如," ADVISORS" .titleize的转换是" Ad VI Sors",因为VI成为一个整体词。
Dashes被删除。
似乎这个通用问题应该有一个通用的宝石,但我找不到。这个问题真的不常见吗?除了彻底破解当前的变形库之外,最好的解决方案是什么?
答案 0 :(得分:3)
公司名称有点奇怪,因为很多时候它们都是Marks(如Service Mark),而不是专有名称。这意味着精确的大写可能实际上很重要,尝试标题可能不值得。
无论如何,这是一种可行的模式。构建令牌列表以“保留”,然后手动拆分字符串并标记非令牌部分。
# 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