如何使用正则表达式对列表元素进行排序?

时间:2015-12-10 10:48:13

标签: ruby regex sorting

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']

实现它的好方法是什么?

1 个答案:

答案 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