有没有办法从字符串中提取城市名称? E.g:
"I'm going to New York then to Berlin"
# => ["New York", "Berlin"]
答案 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"
]