Классификация массива строк в регулярное выражение замыкания - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий массив:

 a
=> ["http://dominio-1-736865.com/path1",
 "http://dominio-2-570941.com/path2",
 "http://102.160.194.146/path4",
 "http://142.231.2.110",
 "http://142.231.2.110/path/inventado",
 "http://dominio-3-468658.com/path2",
 "http://dominio-3-468658.com/path2/path1",
 "http://dominio-3-468658.com/path2/path2",
 "http://subdominio.dominio-3-468658.com/path2",
 "http://www.dominio-3-468658.com/path2",
 "http://este-se-repite.re/AP-448055"]

Затем мне нужно сгруппировать следующим образом:

fqdns
=> ["dominio-1-736865.com", "dominio-2-570941.com", "102.160.194.146", "142.231.2.110", "dominio-3-468658.com", "subdominio.dominio-3-468658.com", "este-se-repite.re"]

получить это =

["http://dominio-1-736865.com/path1"]
["http://dominio-2-570941.com/path2"]
["http://102.160.194.146/path4"]
["http://142.231.2.110", "http://142.231.2.110/path/inventado"]
["http://dominio-3-468658.com/path2", "http://dominio-3-468658.com/path2/path1", "http://dominio-3-468658.com/path2/path2", "http://www.dominio-3-468658.com/path2"]
["http://subdominio.dominio-3-468658.com/path2"]
["http://este-se-repite.re/AP-448055"]

Проблема в том,с subdominio.dominio-3-468658.com и dominio3-468658.com, это может быть в два, но мне нужно встретиться только в том, который имеет поддомен.как можно добиться этого в ruby ​​

[25] pry(#<Notifications::Notification>)> a.map{|d| d.match(fqdns[1])}
=> [nil, #<MatchData "dominio-2-570941.com">, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[26] pry(#<Notifications::Notification>)> a.map{|d| d.match(fqdns[0])}
=> [#<MatchData "dominio-1-736865.com">, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[27] pry(#<Notifications::Notification>)> a.map{|d| d.match(fqdns[2])}
=> [nil, nil, #<MatchData "102.160.194.146">, nil, nil, nil, nil, nil, nil, nil, nil]
[28] pry(#<Notifications::Notification>)> a.map{|d| d.match(fqdns[3])}
=> [nil, nil, nil, #<MatchData "142.231.2.110">, #<MatchData "142.231.2.110">, nil, nil, nil, nil, nil, nil]
[29] pry(#<Notifications::Notification>)> a.map{|d| d.match(fqdns[4])}
=> [nil, nil, nil, nil, nil, #<MatchData "dominio-3-468658.com">, #<MatchData "dominio-3-468658.com">, #<MatchData "dominio-3-468658.com">, #<MatchData "dominio-3-468658.com">, #<MatchData "dominio-3-468658.com">, nil]
[30] pry(#<Notifications::Notification>)> a.map{|d| d.match(fqdns[5])}
=> [nil, nil, nil, nil, nil, nil, nil, nil, #<MatchData "subdominio.dominio-3-468658.com">, nil, nil]
[31] pry(#<Notifications::Notification>)> a.map{|d| d.match(fqdns[6])}
=> [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, #<MatchData "este-se-repite.re">]

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Нет необходимости добавлять здесь регулярные выражения (и создавать еще одну проблему).Используйте правильный инструмент для работы: парсеры URI.

uris = ["http://dominio-1-736865.com/path1",
 "http://dominio-2-570941.com/path2",
 "http://102.160.194.146/path4",
 "http://142.231.2.110",
 "http://142.231.2.110/path/inventado",
 "http://dominio-3-468658.com/path2",
 "http://dominio-3-468658.com/path2/path1",
 "http://dominio-3-468658.com/path2/path2",
 "http://subdominio.dominio-3-468658.com/path2",
 "http://www.dominio-3-468658.com/path2",
 "http://este-se-repite.re/AP-448055"]

 require 'uri'

 uris.group_by{|u| URI(u).host}.values
 # => [
 #  ["http://dominio-1-736865.com/path1"], 
 #  ["http://dominio-2-570941.com/path2"], 
 #  ["http://102.160.194.146/path4"], 
 #  ["http://142.231.2.110", "http://142.231.2.110/path/inventado"], ["http://dominio-3-468658.com/path2", "http://dominio-3-468658.com/path2/path1", "http://dominio-3-468658.com/path2/path2"], 
 #  ["http://subdominio.dominio-3-468658.com/path2"], 
 #  ["http://www.dominio-3-468658.com/path2"], 
 #  ["http://este-se-repite.re/AP-448055"]
 #]

Наконец, если вы хотите поставить домены с "www."в том же ведре со своими голыми версиями:

uris.group_by{|u| URI(u).host.sub(/^www\./, '')}
=> {"dominio-1-736865.com"=>["http://dominio-1-736865.com/path1"],
 "dominio-2-570941.com"=>["http://dominio-2-570941.com/path2"],
 "102.160.194.146"=>["http://102.160.194.146/path4"],
 "142.231.2.110"=>["http://142.231.2.110", "http://142.231.2.110/path/inventado"],
 "dominio-3-468658.com"=>
  ["http://dominio-3-468658.com/path2", "http://dominio-3-468658.com/path2/path1", "http://dominio-3-468658.com/path2/path2", "http://www.dominio-3-468658.com/path2"],
 "subdominio.dominio-3-468658.com"=>["http://subdominio.dominio-3-468658.com/path2"],
 "este-se-repite.re"=>["http://este-se-repite.re/AP-448055"]}
0 голосов
/ 29 ноября 2018

Вы можете использовать Enumerable#group_by:

a.group_by {|url| url.match(/http:\/\/([^\/]*)\/?/)[1] }.values
# ["http://dominio-2-570941.com/path2"],
# ["http://102.160.194.146/path4"],
# ["http://142.231.2.110", "http://142.231.2.110/path/inventado"],
# ["http://dominio-3-468658.com/path2",
#  "http://dominio-3-468658.com/path2/path1",
#  "http://dominio-3-468658.com/path2/path2"],
# ["http://subdominio.dominio-3-468658.com/path2"],
# ["http://www.dominio-3-468658.com/path2"],
# ["http://este-se-repite.re/AP-448055"]]

Regex объяснение (без экранирования) http://([^/]*)/?

  • http:// соответствует префиксу (то же самое)в каждом адресе)
  • ([^/]*) захватывает часть узла - все, кроме косой черты /
  • /? необязательная косая черта, заканчивающаяся адресом
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...