如何在 ruby 中编写此正则表达式? (解析 Gmail API 字段)
How do I write this regex in ruby? (parsing Gmail API fields)
我有 3 种类型的字符串需要解析:
"John Smith <jsmith@gmail.com>"
"\"jsmith@gmail.com\" <jsmith@gmail.com>, \"bob@gmail.com\" <bob@gmail.com>"
"\"yo@gmail.com\" <yo@gmail.com>, John Smith <jsmith@gmial.com>"
我需要每个的散列,看起来像:
{ 'John Smith' => 'jsmith@gmail.com' } # for the first one
{ 'jsmith@gmail.com' => 'jsmith@gmail.com', 'bob@gmail.com' => 'bob@gmail.com' } # for the second one
{ 'yo@gmail.com' => 'yo@gmail.com', 'John Smith' => 'jsmith@gmail.com' } # for the third one
可以使用mailgem解析
emails = "\"jsmith@gmail.com\" <jsmith@gmail.com>, \"bob@gmail.com\" <bob@gmail.com>, \"Bobby\" <bobby@gmail.com>"
raw_addresses = Mail::AddressList.new(emails)
result = raw_addresses.addresses.map {|a| {name: a.name, email: a.address}}
同一线程:Whosebug thread
myHash = {}
str = "\"vishal@sendsonar.com\" <vishal@sendsonar.com>, Michael Makarov <michael@sendsonar.com>"
str.strip.split(',').map{|x| x.strip}.each do |contact|
parts = contact.scan(/"{0,1}(.*?)"{0,1} <(.*?)>/)
myHash[parts[0][0]] = parts[0][1]
end
这是一个正则表达式,不需要 gem...
它可能需要一些测试,但看起来没问题。
str = "yo0@gmail.com; yo1@gmail.com, \"yo2@gmail.com\" <yo@gmail.com>, John Smith <jsmith@gmial.com>"
str.split(/[\s]*[,;][\s]*/).each.with_object({}) {|addr, hash| a = addr.match(/[\"]?([^\"\<]*)[\"]?[\s]*\<([\w@\w\.]+)\>/) ; a ? hash[a[1].strip] = a[2]: hash[addr] = addr}
# => {"yo0@gmail.com"=>"yo0@gmail.com", "yo1@gmail.com"=>"yo1@gmail.com",
# "yo2@gmail.com"=>"yo@gmail.com", "John Smith"=>"jsmith@gmial.com"}
请注意,哈希不会包含两个相同的密钥 - 因此使用哈希可能会导致数据丢失!
考虑以下情况:
一个人有两个电子邮件地址。
名字相同但电子邮件地址不同的两个人。
这两种情况在使用哈希时都会导致数据丢失,而不是使用数组。数组数组和哈希数组都可以正常工作。
观察:
str = "John Smith <email1@gmail.com>, John Smith <another_address@gmail.com>"
str.split(/[\s]*[,;][\s]*/).each.with_object({}) {|addr, hash| a = addr.match(/[\"]?([^\"\<]*)[\"]?[\s]*\<([\w@\w\.]+)\>/) ; a ? hash[a[1].strip] = a[2]: hash[addr] = addr}
# => {"John Smith"=>"another_address@gmail.com"}
# Only ONE email extracted.
str.split(/[\s]*[,;][\s]*/).each.with_object([]) {|addr, arry| a = addr.match(/[\"]?([^\"\<]*)[\"]?[\s]*\<([\w@\w\.]+)\>/) ; a ? arry << [ a[1].strip, a[2] ]: [ addr, addr ]}
# => [["John Smith", "email1@gmail.com"], ["John Smith", "another_address@gmail.com"]]
# Both addresses extracted.
str.split(/[\s]*[,;][\s]*/).each.with_object([]) {|addr, arry| a = addr.match(/[\"]?([^\"\<]*)[\"]?[\s]*\<([\w@\w\.]+)\>/) ; a ? arry << {name: a[1].strip, email: a[2] }: {email: addr} }
# => [{:name=>"John Smith", :email=>"email1@gmail.com"}, {:name=>"John Smith", :email=>"another_address@gmail.com"}]
# Both addresses extracted.
祝你好运!
我有 3 种类型的字符串需要解析:
"John Smith <jsmith@gmail.com>"
"\"jsmith@gmail.com\" <jsmith@gmail.com>, \"bob@gmail.com\" <bob@gmail.com>"
"\"yo@gmail.com\" <yo@gmail.com>, John Smith <jsmith@gmial.com>"
我需要每个的散列,看起来像:
{ 'John Smith' => 'jsmith@gmail.com' } # for the first one
{ 'jsmith@gmail.com' => 'jsmith@gmail.com', 'bob@gmail.com' => 'bob@gmail.com' } # for the second one
{ 'yo@gmail.com' => 'yo@gmail.com', 'John Smith' => 'jsmith@gmail.com' } # for the third one
可以使用mailgem解析
emails = "\"jsmith@gmail.com\" <jsmith@gmail.com>, \"bob@gmail.com\" <bob@gmail.com>, \"Bobby\" <bobby@gmail.com>"
raw_addresses = Mail::AddressList.new(emails)
result = raw_addresses.addresses.map {|a| {name: a.name, email: a.address}}
同一线程:Whosebug thread
myHash = {}
str = "\"vishal@sendsonar.com\" <vishal@sendsonar.com>, Michael Makarov <michael@sendsonar.com>"
str.strip.split(',').map{|x| x.strip}.each do |contact|
parts = contact.scan(/"{0,1}(.*?)"{0,1} <(.*?)>/)
myHash[parts[0][0]] = parts[0][1]
end
这是一个正则表达式,不需要 gem...
它可能需要一些测试,但看起来没问题。
str = "yo0@gmail.com; yo1@gmail.com, \"yo2@gmail.com\" <yo@gmail.com>, John Smith <jsmith@gmial.com>"
str.split(/[\s]*[,;][\s]*/).each.with_object({}) {|addr, hash| a = addr.match(/[\"]?([^\"\<]*)[\"]?[\s]*\<([\w@\w\.]+)\>/) ; a ? hash[a[1].strip] = a[2]: hash[addr] = addr}
# => {"yo0@gmail.com"=>"yo0@gmail.com", "yo1@gmail.com"=>"yo1@gmail.com",
# "yo2@gmail.com"=>"yo@gmail.com", "John Smith"=>"jsmith@gmial.com"}
请注意,哈希不会包含两个相同的密钥 - 因此使用哈希可能会导致数据丢失!
考虑以下情况:
一个人有两个电子邮件地址。
名字相同但电子邮件地址不同的两个人。
这两种情况在使用哈希时都会导致数据丢失,而不是使用数组。数组数组和哈希数组都可以正常工作。
观察:
str = "John Smith <email1@gmail.com>, John Smith <another_address@gmail.com>"
str.split(/[\s]*[,;][\s]*/).each.with_object({}) {|addr, hash| a = addr.match(/[\"]?([^\"\<]*)[\"]?[\s]*\<([\w@\w\.]+)\>/) ; a ? hash[a[1].strip] = a[2]: hash[addr] = addr}
# => {"John Smith"=>"another_address@gmail.com"}
# Only ONE email extracted.
str.split(/[\s]*[,;][\s]*/).each.with_object([]) {|addr, arry| a = addr.match(/[\"]?([^\"\<]*)[\"]?[\s]*\<([\w@\w\.]+)\>/) ; a ? arry << [ a[1].strip, a[2] ]: [ addr, addr ]}
# => [["John Smith", "email1@gmail.com"], ["John Smith", "another_address@gmail.com"]]
# Both addresses extracted.
str.split(/[\s]*[,;][\s]*/).each.with_object([]) {|addr, arry| a = addr.match(/[\"]?([^\"\<]*)[\"]?[\s]*\<([\w@\w\.]+)\>/) ; a ? arry << {name: a[1].strip, email: a[2] }: {email: addr} }
# => [{:name=>"John Smith", :email=>"email1@gmail.com"}, {:name=>"John Smith", :email=>"another_address@gmail.com"}]
# Both addresses extracted.
祝你好运!