Hatena::ブログ(Diary)

Alone Like a Rhinoceros Horn

2011-09-14

alignta でパターンを正規表現として解釈、は本当に使いやすいのか?

試行錯誤の自問自答中。

を受けて、別ブランチにて作業を開始し、パターンを(デフォルトで)正規表現として解釈するように修正したところ、(当然のごとく)テストがこけるようになった。見てみると

Alignta /* */

みたいなやつが軒並みこけていた。当然。なぜなら * は正規表現メタ文字だからだ。これまでは ! を付けなければパターンは字面通りの文字列として解釈(正規表現メタ文字はエスケープ)されていたので、これでよかったのだが、

新しい仕様ではこれを正規表現として解釈するので /* は 0回以上の / という意味のパターンになってしまう。これをエスケープするには

Alignta -e /* -e */

または

Alignta -E /* */

としなければならない。こうして見ると結構めんどくさい気がする。というか、うっかりエスケープの指定忘れが頻発しそうな予感。

厄介なことに * は C言語のコメント開始/終了に使われている記号なので、このミス(エスケープの指定忘れ)、やる人が多いんじゃないかなー。

やっぱり、こういう意図しない整列が行われてしまう可能性があるので、デフォルト正規表現になっているのはちょっとまずいかも知れないと考えている。デフォルトとしては字面通りの文字列として解釈されることを保証して、一部正規表現を使用したいところで、安全装置を解除する的な仕様の方がいいのではないだろうか。

コマンド名に ! を付けたら正規表現として解釈、というのは元々そういう発想にもとづいたものだった。ただ、「それって2つのコマンドの使い分けだよね」、「一括指定しかできないの」、というところが元々の問題意識だったはず。

だったら逆に、正規表現として解釈したいものの前に -r とか -R とかを付けるようにした方がいいのではないか。(-regexp, -Regexp ね)

Alignta -r \d\+

だがこれも、うっかり -r を忘れるというミスが頻発しそうな予感。あちら立てればこちら立たず、ぬーん。

こうなったら、正規表現っぽく見えるものは正規表現として解釈、みたいな仕組みを取り入れてみようか。例えば、\ でエスケープされた文字があればそれは正規表現メタ文字(である可能性が大)なので、それは正規表現と解釈するとか。そうすれば、エスケープの指定やら、正規表現としての解釈の指定やらをしなくても

Alignta \d\+ /* */

こんなのが通るようになる。で、この自動的な解釈の振る舞いを抑制するのに -e とか -r とかを使うようにすればいい感じになるのではないか。