にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

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のライブラリ見たら全く同じものがあるじゃまいか・・・次からはこっち使おう。