みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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つのメールアドレスを取得する方法はないでしょうか
よろしくお願いします

投稿日時 - 2008-11-08 00:26:27

QNo.4461653

困ってます

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

#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

投稿日時 - 2008-11-08 02:04:58

お礼

ご回答ありがとうございました
テストしたところ期待通りの結果になりました

patternの「( )」がミソでしたね
ありがとうございます

投稿日時 - 2008-11-08 10:47:16

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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
とか?

投稿日時 - 2008-11-08 07:09:46

お礼

ご回答ありがとうございました

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

投稿日時 - 2008-11-08 10:52:02

ANo.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
で出来ると思います。
人数が不定の場合は、一人分ずつ検索、削除して、ヒットしなくなるまでループを回す位しか思いつきません。
正規表現の達人の回答に期待。

投稿日時 - 2008-11-08 01:03:15

あなたにオススメの質問