list = [
'Urząd Skarbowy 59-700 Bolesławiec ul. Garncarska 10',
'Urząd Skarbowy 57-500 Bystrzyca Kłodzka ul. Adama Mickiewicza 5',
'Urząd Skarbowy 58-200 Dzierżoniów ul. Pocztowa 14',
'Urząd Skarbowy 67-200 Głogów ul. Adama Mickiewicza 53'
]
我想按城市对此列表进行排序 - 字符串,显示在邮政索引(dd-ddd
)和字ul
之间。在这种情况下,城市是:
['Bolesławiec', 'Bystrzyca Kłodzka', 'Dzierżoniów', 'Głogów']
实现它的好方法是什么?
答案 0 :(得分:5)
▶ list.sort_by { |s| s[/(?<=\d\d-\d\d\d\s).*?(?=ul.)/] }
#⇒ [
# [0] "Urząd Skarbowy 59-700 Bolesławiec ul. Garncarska 10",
# [1] "Urząd Skarbowy 57-500 Bystrzyca Kłodzka ul. Adama Mickiewicza 5",
# [2] "Urząd Skarbowy 58-200 Dzierżoniów ul. Pocztowa 14",
# [3] "Urząd Skarbowy 67-200 Głogów ul. Adama Mickiewicza 53"
# ]
请注意,上面的正则表达式假设您有ul.
作为街道名称终止符。可能在大多数情况下,使用街道名称中的第一个单词(或者发明更复杂的终结符)是安全的。
▶ list.sort_by { |s| s[/(?<=\d{2}-\d{3}\s)\w+/] }
UPD 联合收割机:
▶ list.sort_by do |s|
▷ s[/(?<=\d\d-\d\d\d\s).*?(?=ul.)/] || \ # try to catch `ul.`
▷ s[/(?<=\d{2}-\d{3}\s)\p{Alpha}+/] || \ # no worries, use first word
▷ '' # OK, failed to catch anything
▷ end
请注意\p{Alpha}
匹配器\w
因变音符号而无法在此处使用。
NB 我想的越多,我就越相信如果没有捕获ul.
,它应该按匹配排序,直到字符串的结尾:
▶ list.sort_by do |s|
▷ (s[/(?<=\d\d-\d\d\d\s).*?(?=ul.)/] || s[/(?<=\d{2}-\d{3}\s).+?$/]).strip
▷ end