夏の正規表現祭りで一つ大事なことを言い忘れていたのは猛暑のせいにしておこう。
JavaScript (
それは、タイトルどおり、/dan|dankogai/と/dankogai|dan/が違うということ。
Perl 5.12
use 5.012; say ( "dankogai" =~ /(dan|dankogai)/ ); say ( "dankogai" =~ /(dankogai|dan)/ );
JavaScript (SpiderMonkey 1.7 node.js)
"dankogai".match(/(dan|dankogai)/); console.log(RegExp.$1); "dankogai".match(/(dankogai|dan)/); console.log(RegExp.$1);
Ruby 1.9
"dankogai".match(/(dan|dankogai)/){ |m| p m }
"dankogai".match(/(dankogai|dan)/){ |m| p m }
どちらも/dan(?:kogai)?/と等価と思いきや、大間違い。/dankogai|dan/はそうだけど、/dan|dankogai/はただの/dan/と等価。
そうなるのは、 alteration の実装に原因がある。単純なリニアサーチの上、一致したところで探索を打ち切ってしまうのだ。
TRIE Optmizationの入ったPerl 5.9以降であれば一致するかと思ったら、そんなことはありませんでしたorz。
というわけで、よい子はRegexp::Assembleを使いましょうということなのだけど、他の言語で正規表現しているひとたちはどうしているのだろう…
Dan the (Irr|R)egular Expressionist

このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。