将字符串转换为句子大小写,但不要改变首字母缩略词

时间:2012-08-03 14:08:44

标签: string

这不是特定于语言的问题。

我在ALL CAPS中有一个字符串。这个字符串来自一个单独的来源,由于某种原因总是全部大写。

我已经被赋予了使字符串更易于读者阅读的任务,因此我决定使用简单的正则表达式对其进行一个句子转换器方法。

问题是,这个字符串中使用了很多首字母缩略词,我想让它们不受影响。像国家代码(美国,加拿大,日本,法国等),或机场代码(LAX,LGA),有时还有许多其他代码。

现在我猜我首先需要一个数据库中的首字母缩略词列表,包括所有可能的机场代码,国家代码和常用的首字母缩略词列表,如ETA,COD等......

创建此数据库后,如何将其应用于相关字符串?如何防止“我们”改为美国,反之亦然?我基本上想知道的是,如何获取数据库中的内容并对字符串应用所有必要的更改?

请记住,我在ALL CAPS中获得原始字符串,因此无法区分。

任何想法都将不胜感激!!

感谢!!!

1 个答案:

答案 0 :(得分:1)

可以使用ActiveSupport::Inflector来完成与此相近的事情,titleize提供String.titleize方法(为inflections工作)。

首先,在初始化程序中定义您自己的{{3}}。

# config/initializers/inflections.rb
ActiveSupport::Inflector.inflections do |inflect|
  inflect.acronym 'US'
end

重新启动您的应用以获取更改。现在titleize知道如何处理“美国”。启动Rails控制台以查看它:

> "us".titleize
=> "US"

接下来,查看titleize的源代码。理解之后,在初始化程序中重新打开Inflector类,并定义自己的方法,不要将每个单词的第一个字母大写。称之为漂亮的东西,比如decapitalize

module ActiveSupport::Inflector
  def decapitalize(word)
    humanize(underscore(word)) # you may enhance this a bit
  end
end

class String
  def decapitalize
    ActiveSupport::Inflector.decapitalize(self)
  end
end

警告和限制

您可能需要调整代码,但我认为它很接近。

以下是此解决方案无法处理的一些句子:

> "US STATES VISITED BY US".titleize
=> "US States Visited By US"
> "COLUMBIA (CO) EXPORTS ARE PROCESSED BY ACME BUILDING CO.".decapitalize
=> "Columbia (CO) exports are processed by acme building CO."