Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 需要将电子邮件地址字符串的某些部分用引号括起来_Ruby - Fatal编程技术网

Ruby 需要将电子邮件地址字符串的某些部分用引号括起来

Ruby 需要将电子邮件地址字符串的某些部分用引号括起来,ruby,Ruby,给定如下字符串: Bob Smith <bobsmith@gmail.com>, Jones, Rich A. <richjones@gmail.com> Bob Smith,Jones,Rich A。 我需要生成这样的字符串: Bob Smith <bobsmith@gmail.com>, "Jones, Rich A." <richjones@gmail.com> Bob Smith,“琼斯,Rich A 或者(如果这更容易): “鲍勃

给定如下字符串:

Bob Smith <bobsmith@gmail.com>, Jones, Rich A. <richjones@gmail.com>
Bob Smith,Jones,Rich A。
我需要生成这样的字符串:

Bob Smith <bobsmith@gmail.com>, "Jones, Rich A." <richjones@gmail.com>
Bob Smith,“琼斯,Rich A
或者(如果这更容易):

“鲍勃·史密斯”、“琼斯,里奇·A”

在Ruby中,最优雅的方法是什么?

构建一个与“名称”匹配的正则表达式,并用引号中的相同字符串替换循环中的每个匹配项。查看
String
类和正则表达式匹配器,尤其是那些迭代匹配的匹配器。

你可能会喜欢正则表达式,我相信有人会花时间构建一个,但是如果你想要有意义的东西:

# s is the string
def add_quotes(s)
  s = s.split
  new_s = []
  s.each do |w|
    unless w.index('<') == 0 && w.index('>') == w.length-1
      new_s << "\"#{w}\""
    else
      new_s << w
    end
  end

  new_s.join(' ')
end
#s是字符串
def添加_引号
s=s.split
新的
s、 每个都有| w|
除非w.index(“”)=w.length-1

新功能您可以执行gsub或扫描。无论哪种方式,正则表达式都是最优雅的。我建议你扫描一下,这样你就可以选择浏览每个电子邮件地址并做任何你想做的事情(包括决定是否引用这个名字)

str=鲍勃·史密斯、琼斯、里奇A。 电子邮件地址=[] str.scan(/\s*(.*?)\s*(?:,|\Z)/)不匹配| #收益率[“鲍勃·史密斯”bobsmith@gmail.com"] #然后[“琼斯,里奇A.,”richjones@gmail.com"] 电子邮件地址为“鲍勃·史密斯”、“琼斯、里奇·A”
祝你好运

它适用于所询问的场景,但不适用于名字中有引号的人。我不确定正则表达式是否是最好的解决方案。话虽如此,我不确定替代方案是什么。我不会投反对票,但这不会处理名称中的引号。@Andrew-为什么?它会做什么呢?它不会对引号做任何特殊的转义。因此,您将得到
“George”Dubya“Bush”
,这将使下一个解析器感到困惑。
# s is the string
def add_quotes(s)
  s = s.split
  new_s = []
  s.each do |w|
    unless w.index('<') == 0 && w.index('>') == w.length-1
      new_s << "\"#{w}\""
    else
      new_s << w
    end
  end

  new_s.join(' ')
end
str = Bob Smith <bobsmith@gmail.com>, Jones, Rich A. <richjones@gmail.com> email_addrs = [] str.scan(/\s*(.*?)\s*<(.+?)>(?:,|\Z)/) do |match| # yields ["Bob Smith", "bobsmith@gmail.com"] # then ["Jones, Rich A.", "richjones@gmail.com"] email_addrs << "\"#{match.first}\" <#{match.last}>" end email_addrs.join(", ") #=> "Bob Smith" <bobsmith@gmail.com>, "Jones, Rich A." <richjones@gmail.com>