使用ruby从字符串中提取城市名称

时间:2012-10-08 11:06:27

标签: ruby ruby-on-rails-3.2

有没有办法从字符串中提取城市名称? E.g:

"I'm going to New York then to Berlin"
# => ["New York", "Berlin"]

2 个答案:

答案 0 :(得分:2)

你可以这样做:

regex = /New York|Berlin|Amsterdam|Tokyo|Paris|London/
"I'm going to New York then to Berlin".scan(regex) #=> ["New York", "Berlin"]

如果这不符合您的意思,请改进您的问题。

答案 1 :(得分:2)

您需要一个城市名称列表,这可能是一个巨大的列表,包含多种拼写版本和许多重复版本。

获得所需的列表后,这将返回一个可用的正则表达式,可用于扫描字符串,返回列表中的城市:

cities = [
  'Albuquerque',
  'Alexandria',
  'Jackson',
  'Ammansland',
  'Darby',
  'Atkins Bank',
  'Kingston',
  'Kinston',
  'Caswell',
  'Kinston',
  'Awiehawken',
  'Weehawken',
  'Bergen',
  'Jersey City',
  'Berlin',
  'Marne',
  'Beverwijck',
  'Albany',
  'Breuckelen',
  'Brooklyn',
  'New York',
  'Campbellton',
  'Cross Creek',
  'Fayetteville',
  'Chamassungh',
  'Finlandia',
  'Marcus Hook',
  'Charleston',
  'St. Charles',
].uniq(&:downcase).sort_by(&:downcase)

regex = /\b#{ Regexp.union(cities) }\b/i

正则表达式构建如下:

puts regex.source

# => \b(?-mix:Albany|Albuquerque|Alexandria|Ammansland|Atkins\ Bank|Awiehawken|Bergen|Berlin|Beverwijck|Breuckelen|Brooklyn|Campbellton|Caswell|Chamassungh|Charleston|Cross\ Creek|Darby|Fayetteville|Finlandia|Jackson|Jersey\ City|Kingston|Kinston|Marcus\ Hook|Marne|St\.\ Charles|Weehawken)\b

定义正则表达式后,您可以执行以下操作:

"I'm going to New York then to Berlin".scan(regex)

会返回:

# => [
    [0] "New York",
    [1] "Berlin"
]