- ベストアンサー
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つのメールアドレスを取得する方法はないでしょうか よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#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
その他の回答 (2)
- n-jun
- ベストアンサー率33% (959/2873)
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 とか?
お礼
ご回答ありがとうございました メールアドレスには数字や記号(-、_)を含むことがあるので RegExp.Pattern = "<([a-z@.]+)>" は少し加工が必要ですが、実際に使用するメールアドレスのStringには < >で括られていないメールアドレスもありましたので、n-jun様の「連続する文字と数字と一部の記号を取り出す方法」の方が可用性が高いように思います。この方法で実現したいと思います
- mitarashi
- ベストアンサー率59% (574/965)
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 で出来ると思います。 人数が不定の場合は、一人分ずつ検索、削除して、ヒットしなくなるまでループを回す位しか思いつきません。 正規表現の達人の回答に期待。
お礼
ご回答ありがとうございました テストしたところ期待通りの結果になりました patternの「( )」がミソでしたね ありがとうございます