ということをやってみます。

前提


まず、初めに「メールアドレスっぽい何か」と表現している理由です。

  • 私が正規表現ほとんど使ったことない
  • 私がメールアドレスに関するRFCをあまり理解していない
  • メールアドレスを正規表現で取得と言っても要件による部分が大きい

上記の理由より「メールアドレスっぽい何か」という書き方をしてます。もうちょっと正規表現とメールアドレスのRFCについて勉強しろよ!という話なのですが、ちょっとそこまでパワーが回せないので…すみません…

今回は「メールアドレスっぽい何か」を取得するために正規表現を使っていますが、その正規表現は下記のRFCを参考にしています。

A valid e-mail address

コード


こういう感じのコードで取得できます。

1
2
3
4
5
6
7
8
9
10
11
12
private static readonly string emailRegex = "[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+[.a-zA-Z0-9-]+";
private static readonly string[] excludeList = { "@example.com", "hoge@test.com" };

public static IEnumerable<string> FindEmailsInContent(string text)
{

return Regex.Matches(text, emailRegex)
.Cast<Group>()
.Select(g => g.Value.Replace("<", "").Replace(">", "").Trim())
.Where(s => !excludeList .Any(c => s.EndsWith(c)))
.Distinct()
;
}

これで「メールアドレスっぽい何か」が取得できます。ちょろっと解説しておくと、下記のようなことをやってます。

  • emailRegexに「メールアドレスっぽい何か」の正規表現を指定
  • excludeListに記述したものは取得しない
  • メールアドレスの前後に<>が付いていることがあるので、それは削除する
  • 重複は除く

こんな感じです。RFCに沿った厳密なメールアドレスにするにはもっと複雑な正規表現にする必要があると思います。