2011-01-11 26 views
0

に電子メールアドレスの文字列の特定の部分をラップする必要がこのような文字列を考えますこれは簡単です):は引用符

"Bob Smith" <[email protected]>, "Jones, Rich A." <[email protected]> 

Rubyでこれを行う最もエレガントな方法は何ですか?

答えて

1

をあなたは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]> 

幸運!

+0

これは、尋ねられるシナリオではうまくいくが、名前に引用符を付ける人は扱わないだろう。正規表現が最良の解決策であるかどうかは分かりません。それが言われている、私は代替策がどうなるか分からない。 –

-1

"names"と一致する正規表現を作成し、ループ内の各オカレンスを引用符で囲まれた同じ文字列で置き換えます。 Stringクラスと正規表現マッチャー、特にマッチを反復するものを見てください。

1

あなたは正規表現で空想得ることができる、と私は誰かが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 
+0

私はこれをdownvoteするつもりはありませんが、これは名前の引用符を処理しません。 –

+0

@Andrew - なぜですか?それは代わりに何をするでしょうか? – sethvargo

+0

引用符のために特別なエスケープを行うことはできません。だから、あなたは '' George "Dubya" Bush "<[email protected]>を入手して、次のパーサを混乱させるでしょう。 –