IRCのメッセージを正規表現で表す
RFCを見ながらちまちまとやっていたら随分と長くなってしまったのでここに記しておきます。末尾の改行を除いた状態にしているので、改行も合わせて評価したいときは最後に付け足してください。(長いので無理やり改行しました。お使いの際は改行を取り除いてくださいね)
/^(?-mix:(?::((?:(?:[a-zA-Z0-9])(?:[a-zA-Z0-9-]*[a-zA-Z0-9])?( ?:\.(?:[a-zA-Z0-9])(?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*|(?:[a-zA-Z\ x5B-\x60\x7B-\x7D](?:[a-zA-Z\x5B-\x60\x7B-\x7D0-9-]){0,8}(?:(? :![\x01-\x09\x0B-\x0C\x0E-\x1F\x21-\x3F\x41-\xFF]+)?@(?:(?:[a- zA-Z0-9])(?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\.(?:[a-zA-Z0-9])(?:[ a-zA-Z0-9-]*[a-zA-Z0-9])?)*|(?:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1 ,3}\.[0-9]{1,3}|(?:[0-9A-F]+(?::[0-9A-F]+){7}|0:0:0:0:0:(?:0|F FFF):[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))))?)))\x2 0)?((?:[a-zA-Z]+|[0-9]{3}))(?:((?:\x20+[\x01-\x09\x0B-\x0C\x0E -\x1F\x21-\x39\x3B-\xFF][:\x01-\x09\x0B-\x0C\x0E-\x1F\x21-\x39 \x3B-\xFF]*){0,14})(?:\x20+:([:\x20\x01-\x09\x0B-\x0C\x0E-\x1F \x21-\x39\x3B-\xFF]*))?|((?:\x20+[\x01-\x09\x0B-\x0C\x0E-\x1F\ x21-\x39\x3B-\xFF][:\x01-\x09\x0B-\x0C\x0E-\x1F\x21-\x39\x3B-\ xFF]*){14})(?:\x20+:?([:\x01-\x09\x0B-\x0C\x0E-\x1F\x21-\x39\x 3B-\xFF]*)))?)0x20*$/on
なんか見ていて壮観ですが、実際こんな分かりにくい状態では使わないと思います。
追記
一応後方参照でprefixとcommandとmiddleとparamsを取得できるようにしてあります。取り出し方は以下のような感じ。
prefix = $1 command = $2 if $3 middle = $3 params = $4 elsif $4 params = $4 elsif $5 middle = $5 params = $6 elsif $6 params = $6 end
prefixやmiddleがない場合はnilが突っ込まれます。
ってriceのライブラリ見たら全く同じものがあるじゃまいか・・・次からはこっち使おう。