2015/04/18

正規表現は難しいと思うが面白くもある

長年、勉強せんといかんと思っていた正規表現を、最近やり始めた。
だいたい何かツールを作ったりするときはC/C++でやってるのだけど、少なくとも文字列の操作だけが目的だったら別の言語がよいだろうと思っている。
文字列には文字列を、というわけではないが、スクリプトを書いてやろうとしている。

しかしまあ、初心者には正規表現はつらい。
書いているときはまだわかるんだけど、それを後から見直したとき「何がやりたかったんだっけ?」となることがしばしだ。
コメントを書かないとさっぱり思い出せん(記憶力の問題?)。

それと、ツールによって動きが若干違うことがあるのが、困る。
sedで、コンマで区切られた一番最初の部分、という抜き出しをしたかったのだけど、どうやっても最長一致した文字列しか取ってくれなかったのだ。
秀丸でやるとできるのに、sedだとできない・・・・。
さんざん調べると、sedでは最長一致にしかならないよ、という情報を見つけた。
正規表現の書き方が悪いんだと思って、そっちばかり調べていたのだが、ツールによって違いがあるのに気付いたのはそのときだった。

置換結果の末尾に「0」がつき始めたので「これを勝手につけたのは誰だ!」と思った。
しかし、sedでは「$10」みたいなのは2桁は認識してくれないので「$1」に0がついた結果になっていただけだった、とか。

ちなみにやりたかったのは、C言語のプロトタイプ宣言から戻り値と関数名と引数の型をコンマで区切る、だ。
いろんなことができないのはわかっているから、1行で書かれている、とか、仮引数は必ず書かれている、とかの条件ありありにしたんだけど、それでもかなりかかってしまった。
まだツールの選択肢と使える正規表現の数が少ないせいかもしれんが、どうやるのが一番速かったんだろう?

 

ただ、文字列のとらえ方が違う観点からできるようになったのは、よいことだった。
繰り返しが0回以上/1回以上とか、この文字に当てはまる/当てはまらないとか、そういうのをつなぎ合わせて文字列は構成されてるんだなー、という、当たり前といえば当たり前なんだけど、そういうとらえ方。
他の言語もたまにはやってみらんといかんですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。