Ruby on rails 在Ruby on Rails中使用罗马数字、破折号、撇号等标题

Ruby on rails 在Ruby on Rails中使用罗马数字、破折号、撇号等标题,ruby-on-rails,ruby,ruby-on-rails-4,activesupport,Ruby On Rails,Ruby,Ruby On Rails 4,Activesupport,我只是想把大写的公司名称转换成专有名称 公司名称可包括: 破折号 撇号 罗马数字 文本,如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 但是,转换不考虑分词,因此使用VI和VII不起作

我只是想把大写的公司名称转换成专有名称

公司名称可包括:

  • 破折号
  • 撇号
  • 罗马数字
  • 文本,如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
    
    但是,转换不考虑分词,因此使用
    VI
    VII
    不起作用。例如,“ADVISORS”的转换。titleize是“advi Sors”,因为VI变成了一个完整的单词

    破折号将被删除


    似乎应该有一个通用宝石来解决这个通用问题,但我没有找到。这个问题真的不是很普遍吗?除了完全破解当前的拐点库之外,还有什么最好的解决方案呢?

    公司名称有点奇怪,因为很多时候它们是标记(如服务标记)而不是专有名称。这意味着精确的资本化可能实际上很重要,试图将其产权化可能不值得

    在任何情况下,这里有一个模式可能会起作用。构建要“保留”的令牌列表,然后手动拆分字符串并将非令牌部分标题化

    # 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
    

    那VI和XI这样的名字呢?我认为一个可能的解决方案是将公司名称拆分成几个单词,然后调用titleize,然后重新组合,但记住拆分字符。是的,这就是代码的作用。您需要将任何不应标题化的字符串添加到标记regex(例如,IX)。稍后我将尝试该代码,但阅读它时,似乎VI作为标记会将advisor拆分为AD、VI、sor,然后标题化AD和sor将成为advisor。也许是第一次分裂成文字…哦,我以前误解了。我现在明白你的意思了。我已经更新了代码示例,以便它处理可以作为其他单词的一部分的标记。这非常有效。问题是找到一个好的算法来确定一个短单词是缩写词还是真的短单词。像“VC”应该保持大写,但“COX是一个名字,应该是“COX”。我在处理同一个问题时偶然发现了这个问题。如你所说,将VI设置为首字母缩写确实会导致“ADVISORS”被拆分,但我发现只有当单词都是大写时才可以。小写的是“ADVISORS”“没有得到同样的对待。因为你最终是标题化的,你可以在标题化之前给downcase打电话,得到你所期望的“顾问”,而VI本身仍然会像你所希望的那样结束所有的帽子。