• ベストアンサー

RegExpでメールアドレスを取り出す方法

いつもお世話になっております メールアドレスのString  Aさん <aaa@bbb.ne.ne.jp>,Bさん <bbb@bbb.ne.jp>,Cさん <ccc@ddd.jp.com> から  aaa@bbb.ne.ne.jp  bbb@bbb.ne.jp  ccc@ddd.jp.com を取り出すために正規表現のRegExpを用いました ですが、Pattarnに <.*> を用いると  aaa@bbb.ne.ne.jp>,Bさん <bbb@bbb.ne.jp>,Cさん <ccc@ddd.jp.com がhitしてしまいます。(Global=True、Falseのどちらでも) 何とかうまく3つのメールアドレスを取得する方法はないでしょうか よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です。改訂版(人数不問のコード)ですので、こちらをご利用下さい。 Sub test() Dim targetString As String, patternString As String Dim regEX As Object Dim Matches As Object Dim Match As Object targetString = "Aさん <aaa@bbb.ne.ne.jp>,Bさん <bbb@bbb.ne.jp>,Cさん <ccc@ddd.jp.com>" patternString = "<(.*?)>" Set regEX = CreateObject("VBScript.RegExp") regEX.MultiLine = False regEX.Pattern = patternString regEX.ignorecase = True regEX.Global = True Set Matches = regEX.Execute(targetString) If Matches.Count > 0 Then For Each Match In Matches Debug.Print Match.subMatches.Item(0) Next End If Set Matches = Nothing Set regEX = Nothing End Sub

zap35
質問者

お礼

ご回答ありがとうございました テストしたところ期待通りの結果になりました patternの「( )」がミソでしたね ありがとうございます

その他の回答 (2)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

Sub try() Dim RegExp As Object Dim st As String Dim Matches, Match st = "Aさん <aaa@bbb.ne.ne.jp>,Bさん <bbb@bbb.ne.jp>,Cさん <ccc@ddd.jp.com>" Set RegExp = CreateObject("VBScript.RegEXp") RegExp.Pattern = "<([a-z@.]+)>" RegExp.Global = True If RegExp.test(st) Then Set Matches = RegExp.Execute(st) For Each Match In Matches Debug.Print RegExp.Replace(Match.Value, "$1") Next End If Set Matches = Nothing Set RegExp = Nothing End Sub とか?

zap35
質問者

お礼

ご回答ありがとうございました メールアドレスには数字や記号(-、_)を含むことがあるので  RegExp.Pattern = "<([a-z@.]+)>" は少し加工が必要ですが、実際に使用するメールアドレスのStringには < >で括られていないメールアドレスもありましたので、n-jun様の「連続する文字と数字と一部の記号を取り出す方法」の方が可用性が高いように思います。この方法で実現したいと思います

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

3人固定で良いなら、控えめなマッチングを用いて、 Sub test() Dim targetString As String, patternString As String Dim regEX As Object Dim Matches As Object Dim submatchItem As Variant targetString = "Aさん <aaa@bbb.ne.ne.jp>,Bさん <bbb@bbb.ne.jp>,Cさん <ccc@ddd.jp.com>" patternString = "<(.*?)>.*<(.*?)>.*<(.*?)>" Set regEX = CreateObject("VBScript.RegExp") regEX.MultiLine = False regEX.Pattern = patternString regEX.ignorecase = True regEX.Global = False Set Matches = regEX.Execute(targetString) If Matches.Count > 0 Then For Each submatchItem In Matches(0).subMatches Debug.Print submatchItem Next End If Set Matches = Nothing Set regEX = Nothing End Sub で出来ると思います。 人数が不定の場合は、一人分ずつ検索、削除して、ヒットしなくなるまでループを回す位しか思いつきません。 正規表現の達人の回答に期待。

関連するQ&A