プログラム、システム保守でよく正規表現を使用します。
使っていないとすぐ忘れてしまうので、備忘録がてら残すことにしました。
個人的によく使うのがこれです。
DBのデータをCSVでやりとりすることが多いのですが、そのCSVからINSERT文を作る際に利用します。
下記のようなCSVがあったとしましょう。
"01","みかん","愛媛県" "02","りんご","青森県" "03","なし","福島県"
上記のCSVをそのままSQLにしたいわけです。完成形は↓
INSERT INTO table1 VALUES ('01','みかん','愛媛県'); INSERT INTO table1 VALUES ('02','りんご','青森県'); INSERT INTO table1 VALUES ('03','なし','福島県');
最初にデータの前にINSERT~を挿入します。
置換前
置換後
「^」は行頭を表す正規表現です。
結果は下記のようになったはずです。これで前半部分はOK。
INSERT INTO table1 VALUES ("01","みかん","愛媛県" INSERT INTO table1 VALUES ("02","りんご","青森県" INSERT INTO table1 VALUES ("03","なし","福島県"
これも1と同じ目的で使用します。1で前半部分にINSERT文を挿入しました。
あとは末尾に閉じかっこを入れたい。
置換前
置換後
「$」は行末尾を表す正規表現です。
結果は下記のようになったはずです。あとは使用するDBに応じてダブルクォーテーションをシングルクォーテーションに置換してください。
INSERT INTO table1 VALUES ("01","みかん","愛媛県"); INSERT INTO table1 VALUES ("02","りんご","青森県"); INSERT INTO table1 VALUES ("03","なし","福島県");
これもよく使います。
最近のIDEにはフォーマッターがついているため、変数代入の記述は下記のように整形されます。
$var1 = "test";
$var1001 = "test";
「{変数名}␣=␣{値};」というような半角スペースが1文字入る形ですね。
上記の場合は、代入箇所を探すのに正規表現は不要です。
検索条件
とすれば良いだけ。
しかしプロジェクトによっては、下記のようにインデントを合わせる文化が未だに残っています。ぼくは保守性が悪いから嫌いです。
$var1 = "test";
$var1001 = "test";
こうなってくると正規表現の出番です。
検索条件
「var1」の後ろの半角スペースが1回以上出現するもの、という探し方にすれば解決します。
これはほぼ上記と同じなので詳細は割愛します。下記のようなサンプルソースから代入箇所を含めず、比較箇所のみ抽出します。
$var1 = 1;
if ($var1 == 1) print "1deR";
if ($var1 != 1) print "1denaideR";
if ($var1 >= 1) print "1ijodeR";
下記の条件とすることで、上記サンプルの1行目以外すべて抽出できます。
検索条件
今度は「一定の条件で検索するが、一部除外したい」という場合。下記のようなソースがあったとします。
$var1 = 1;
if ($var1 == 1) print "1deR";
if ($var1 != 1) print "1denaideR";
if ($var1 >= 1) print "1ijodeR";
if ($var1 == 2) print "2deR";
探したいのはvar1の比較箇所、ただし、2との比較は探したくない。とうケース。
ちょっと例題がイマイチですが、ソース量が膨大だと使う場面は結構あります。
検索条件
キャレット「^」は先頭に使うと行頭文字を意味しますが、否定の意味でも使われます。
こうすることで上記サンプルの2~4行目が抽出できます。
こちらは別記事にしました。
ほかにも思いついたら追記します。