これで大丈夫でしょうか?

Pattern pattern = Pattern.compile(
"(([0-9a-zA-Z!#\\$%&'\\*\\+\\-/=\\?\\^_`\\{\\}\\|~]+(\\.[0-9a-zA-Z!#\\$%&'\\*\\+\\-/=\\?\\^_`\\{\\}\\|~]+)*)|(\"[^\"]*\"))"
"@[0-9a-zA-Z\\-]+(\\.[0-9a-zA-Z\\-]+)*");

実際のところ、リンクから取得する他に、、Webページの中に普通のテキストで表示してあるメールアドレスも取得したいんですね。
その場合どうするかというと、ページに書いてある全てのテキストをひとつの文字列に格納して、その中からメールアドレスを探してます。
その時はやはりメールアドレスのパターンから探すのがいいのではないかと思います。

まあ実際のところパターン文字列から?だけを削除したものを使って、これまで数百件のメールアドレスのWEBページからの抽出をしましたが、
ほぼエラーなしというか、変な文字列を抽出することはありませんでした。

mailto:info@jafrac.org&abc みたいな記述があればちゃんと抽出出来ないはずだと思うのですが、そうした記述はまずないってことだと思います。
とは言え使えない文字を含めたパターン文字列はまずいと思うので、書き換えてみましたが、これでいいのか不安です。