これらの2つの正規表現を、文字列構造に応じて使用可能なすべての部分をキャプチャする単一の正規表現にマージするにはどうすればよいですか($ sの最後の3つのフィールドはオプションであり、存在する場合はキャプチャする必要があります)。(?= ...)を使用すると、実用的な解決策を得ることができませんでした。
$s='1.2.3.4 - egon [10/Dec/2007:21:07:20 +0100] "GET /x.htm HTTP/1.1" 401 488';
$re = qr/\A
(\d+)\.(\d+)\.(\d+)\.(\d+)
[ ] (\S+)
[ ] (\S+)
[ ]+ \[(\d+)\/(\S+)\/(\d+):(\d+):(\d+):(\d+) [ ] (\S+)\]
[ ] "(\S+) [ ] (.*?) [ ] (\S+)"
[ ] (\S+)
[ ] (\S+)
\Z/x;
print "[".join('],[',$s =~ $re)."]\n\n";
$s='1.2.3.4 - - [13/Jun/2007:01:37:44 +0200] "GET /x.htm HTTP/1.0" 404 283 "-" "Mozilla/5.0..." "-"';
$re = qr/\A
(\d+)\.(\d+)\.(\d+)\.(\d+)
[ ] (\S+)
[ ] (\S+)
[ ]+ \[(\d+)\/(\S+)\/(\d+):(\d+):(\d+):(\d+) [ ] (\S+)\]
[ ] "(\S+) [ ] (.*?) [ ] (\S+)"
[ ] (\S+)
[ ] (\S+) [ ] "(.*?)" [ ] "(.*?)" [ ] "(.*?)"
\Z
/x;
print "[".join('],[',$s =~ $re)."]\n\n";