正規表現上のこのアンダースコアは何を意味するのでしょうか?
アンダースコアは何ら特別な意味を持たないですね。文字通りのアンダースコアです。
ここに示してある正規表現の@マーク以降は、次のようなパターンに一致するように書いてあるように見えます。
ホスト名(アンダースコア可) + ドット + ドメイン名セカンドレベル(省略可、アンダースコア不可) + ドット + ドメイン名トップレベル(アルファベット二文字以上)。ただしホスト名+ドットはなくてもいいし二つ以上続いてもいい。
私はホスト名・ドメイン名の命名規則には詳しくないのでこのコードが意図するところが正しいのか否か判断できませんが、とにかくパターンはそうなっていると思います。ちょっとググってみるとホスト名についてはアンダースコアが使えるとする記述をみつけました。しかしさらに調べると何やら相互に矛盾する記述に行き当たり、RFCの原典を精査する気力はなかったのでそっとブラウザを閉じました。
perlですが、ちょっとしたテストスクリプトを書いてみました。
perl
1
2#!/usr/bin/perl
3
4sub test1{
5 my($t)=@_;
6 print "$t\n";
7 $t =~ /^[\p{L}0-9!#$%&\'*+/=?^_`{|}~-]+(?:.[\p{L}0-9!#$%&\'*+/=?^_`{|}~-]+)*@(?:[_\p{L}0-9][-_\p{L}0-9]*.)*(?:[\p{L}0-9][-\p{L}0-9]{0,62}).(?:(?:[a-z]{2}.)?[a-z]{2,})$/ui
8 and print "All ok\n";
9
10 $t =~ /(?:[\p{L}0-9][-\p{L}0-9]{0,62})./ui
11 and print "ok A\n";
12 $t =~ /@(?:[_\p{L}0-9][-_\p{L}0-9]*.)*/ui
13 and print "ok B\n";
14 $t =~ /@(?:[_\p{L}0-9][-_\p{L}0-9]*.)*(?:[\p{L}0-9][-\p{L}0-9]{0,62})./ui
15 and print "ok C\n";
16}
17
18test1('test@hoge.page.jp'); # all OK
19test1('test@hoge._page.jp'); # NG for 2nd domain
20test1('test@_hoge.page.jp'); # all OK (_hogeはホスト名)
21test1('test@_hoge._page.jp'); # NG for 2nd domain
22test1('test@page.jp'); # all OK
23test1('test@_page.jp'); # NG for 2nd domain (_page はホスト名とは扱われない)
実行結果
test@hoge.page.jp
All ok
ok A
ok B
ok C
test@hoge._page.jp
ok A
ok B
ok C
test@_hoge.page.jp
All ok
ok A
ok B
ok C
test@_hoge._page.jp
ok A
ok B
test@page.jp
All ok
ok A
ok B
ok C
test@_page.jp
ok A
ok B