IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

正規表現の XPath 字句解析その2

またまた

XPath ネタです。
先日、XPath の字句解析をワンライナーで作ってみた。 - IT戦記で書いた正規表現XPath 字句解析ですが、よく考えるといろいろおかしかった(不正な文字が無視されたりする)& id:otsune さんからコメントやブクマの突っ込みもありまして、1から正規表現を勉強してから新しく書き直すことにしました。

正規表現の勉強方法

以下の二つの方法で勉強しました。

1.SpiderMonkey正規表現デバッグオプションを使う

SpiderMonkey をビルドするときに、以下のフラグを付けてビルドします。

$ make -f Makefile.ref "DEFINES=-DREGEXP_DEBUG -DDEBUG"

こうすると正規表現がどういう風に実行されたかを調べることができます。
こんな感じ

$ js
js> 'foobar'.match(/o+/);

000001: plus
000004: flat1 'o' == 'f'
000001: plus
000004: flat1 'o' == 'o' * 
000006:   endchild
000001:   repeat
000004: flat1 'o' == 'o' *      BT_Push: 0,0
000004: flat1 'o' == 'b'
000007: end
oo
js>
2.プログラミング Perl

この本の「正規表現エンジン」の項がめっちゃ分かりやすいです。

と、言う訳でこんな感じで仕上がりました。

var reg = /\$?(?:(?![0-9-])[\w-]+:)?(?![0-9-])[\w-]+|\/\/|\.\.|::|\d+(?:\.\d*)?|\.\d+|"[^"]*"|'[^']*'|[!<>]=|(?![0-9-])[\w-]+:\*|\s+|./g;

かなり、短くなりました。一文字のものは . (ドット)で全部マッチさせているのは、正規表現だけで字句解析をする場合は、構文解析フェーズである程度文字の判別もするのがいいんだろうと思ったからです。

まとめ

これが最良かは分かりませんが、あとは使ってみて試します。
いろいろアドバイスをくださった id:otsune さんありがとうございます!