に電子メールアドレスの文字列の特定の部分をラップする必要がこのような文字列を考えますこれは簡単です):は引用符
"Bob Smith" <[email protected]>, "Jones, Rich A." <[email protected]>
Rubyでこれを行う最もエレガントな方法は何ですか?
に電子メールアドレスの文字列の特定の部分をラップする必要がこのような文字列を考えますこれは簡単です):は引用符
"Bob Smith" <[email protected]>, "Jones, Rich A." <[email protected]>
Rubyでこれを行う最もエレガントな方法は何ですか?
をあなたはGSUBを行う、またはスキャンすることができます。いずれにせよ、正規表現は最もエレガントです。私はスキャンをすることをお勧めします。そうすれば、各電子メールアドレスを調べ、あなたが望むものを(名前を引用するかどうかを決めることを含めて)行うことができます。
str = Bob Smith <[email protected]>, Jones, Rich A. <[email protected]> email_addrs = [] str.scan(/\s*(.*?)\s*<(.+?)>(?:,|\Z)/) do |match| # yields ["Bob Smith", "[email protected]"] # then ["Jones, Rich A.", "[email protected]"] email_addrs << "\"#{match.first}\" <#{match.last}>" end email_addrs.join(", ") #=> "Bob Smith" <[email protected]>, "Jones, Rich A." <[email protected]>
幸運!
"names"と一致する正規表現を作成し、ループ内の各オカレンスを引用符で囲まれた同じ文字列で置き換えます。 String
クラスと正規表現マッチャー、特にマッチを反復するものを見てください。
あなたは正規表現で空想得ることができる、と私は誰かが1を構築するための時間を過ごすことになります確信しているが、あなたは理にかなって何かしたい場合:
# 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
私はこれをdownvoteするつもりはありませんが、これは名前の引用符を処理しません。 –
@Andrew - なぜですか?それは代わりに何をするでしょうか? – sethvargo
引用符のために特別なエスケープを行うことはできません。だから、あなたは '' George "Dubya" Bush "<[email protected]>を入手して、次のパーサを混乱させるでしょう。 –
これは、尋ねられるシナリオではうまくいくが、名前に引用符を付ける人は扱わないだろう。正規表現が最良の解決策であるかどうかは分かりません。それが言われている、私は代替策がどうなるか分からない。 –