2009年12月17日木曜日

左再帰を取り除くメモ

左再帰
A : A B0
| A B1
...
| A Bn
| C0
| C1
...
| Cn
※1 B0 ... Bn はε(空)ではない
※2 C0 ... Cn は A を先頭に持たない

左再帰を消す
A : C0 A_tail?
| C1 A_tail?
...
| Cn A_tail?

A_tail : B0 A_tail?
| B1 A_tail?
...
| Bn A_tail?

2009年12月4日金曜日

Rubyでメールアドレスかどうか調べたくなってみた

結論→今日はメールアドレスかどうかをちゃんと調べる必要がないので適当にごまかしておく。

「やっとくか〜?」と思ったけれど、やっぱり面倒だった。あはは...

厳密には正しくないけど今はまぁこれで十分な感じの正規表現
valid_chars = '[0-9A-Za-z_!#\$%&*+\-\/=\?^_{|}\~\.]+'
valid_pattern = Regexp.new("^(#{valid_chars})@(#{valid_chars})$", nil, 'n')

ところで元ネタは2002年のRubyなので、Regexp#newのパラメータが現在(Ruby 1.8とか1.9)とは異なるようだ。
元ネタではRegexpの引数が2つになっていて、第2引数は 'n' だ。
この 'n' は文字コード "none" の指定じゃないかと思われる。
Regexpのリファレンスマニュアル見ると第2引数がFixnum以外で真ならIGNORECASEになるって。
当時はオプションの指定ができなかったのだろうか?それとも単なる転記ミス?