【问题标题】:Titleize with roman numerals, dashes, apostrophes, etc. in Ruby on Rails在 Ruby on Rails 中使用罗马数字、破折号、撇号等命名
【发布时间】:2014-05-09 03:18:25
【问题描述】:

我只是想将大写的公司名称转换为专有名称。

公司名称可以包括:

  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 变成了一个完整的单词。

破折号被删除。

似乎应该有一个通用 gem 来解决这个通用问题,但我没有找到。这个问题真的不常见吗?除了完全破解当前的变形库之外,最好的解决方案是什么?

【问题讨论】:

  • 我在解决同样的问题时偶然发现了这一点。正如您所指出的,将 VI 设置为首字母缩略词确实会导致“ADVISORS”被拆分,但我发现只有当单词全部大写时才会出现这种情况。小写的“顾问”不会得到同样的对待。由于您最终要进行标题化,因此您可以在 titleize 之前调用 downcase 并按照您的预期获得“顾问”,而 VI 本身仍然按照您的意愿结束所有大写。

标签: ruby-on-rails ruby ruby-on-rails-4 activesupport


【解决方案1】:

公司名称有点奇怪,因为很多时候它们是商标(如服务商标)而不是专有名称。这意味着精确的大小写实际上可能很重要,并且尝试命名可能不值得。

无论如何,这里有一个可行的模式。构建要“保留”的令牌列表,然后手动拆分字符串并为非令牌部分命名。

# 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和像ADVISORS-XI这样的名字怎么样?我认为一个可能的解决方案是将公司名称拆分为单词,然后调用titleize,然后重新组合在一起,但要记住拆分字符。
  • 是的,这就是这段代码的作用。您需要添加任何不应被命名为标记正则表达式的字符串(例如 IX)。
  • 我稍后会尝试代码,但是阅读它,似乎 VI 作为令牌会将 ADVISORS 拆分为 AD、VI、SORS,然后将 AD 和 Sors 命名为 AdVISor。或许先拆分成词吧……
  • 哦,我之前误会了。我明白你现在的意思了。我已经更新了代码示例,因此它可以处理可能是其他单词的一部分的标记。
  • 这很好用。问题是找到一个好的算法来确定一个短词是一个缩写词还是一个真正的短词。就像“VC”应该保持大写,但“COX 是一个名字,应该是“Cox”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多