正規表現で生産性が飛躍する [正規表現]
はじめに
ある書籍と出会うまでは、ある種のテキスト処理といえばエディタやExcelで地道に処理するしかないと思っていました。人手が入るということは、生産性や品質がその時のコンディションで大きく左右されることになります。また、少しずつテキストを加工していくという性質上、一度ミスをすると手戻りが煩雑になり、酷い場合は最初からやり直しということもザラにあります。
今回は、そんな不毛な作業を少しでも解消できる方法を探しているときに出会った”正規表現”という素晴らしい解決方法について簡単に紹介したいと思います。現時点で自分が使いこなせているかと問われたときに、自信をもって「Yes」と解答することはできませんが、そんな初歩的な使い方しかしていない自分でも、知る前と知った後で比較すると、生産性が劇的に向上しているのを感じています。
まず、何ができるのか
”正規表現”は、テキストの検索と置換で強力な効果を発揮します。検索のときには、あるパターンの(例えば、必ず’T’で始まるテーブル名)単語を抽出したり、決まったフォーマットに適合している文字列のみを抽出したりと、一般的なエディタが装備する検索機能とは一味違う検索が可能です。また、置換のときには、置換対象文字列の一部を記憶(変数化)しておき、置換後の文字列で使用したりと、幅広い使い方が可能となります。
ピンと来ないので、とりあえず使ってみる
例えば、後述のような文字列に対して「\w+.sql」と検索するとどうなるでしょうか。
table.sql
index.sql
grant.sql
synonym.sql
readme.txt
check.sh
4行目までのsqlファイルは検索対象となりますが、5行目のtxtファイルや6行目のshファイルは検索対象から外れるはずです。ここで便利な点は、通常、エディタで「.sql」を検索した時は、拡張子のみが検索対象となってしまうところ、”正規表現”を使用することで、ファイル名全体を検索対象とできる点にあります。どう便利かは、置換のときに分かります。
それでは、同じ文字列に対して置換を実施してみましょう。検索対象文字列は「(\w+).sql」、置換文字列は「sql_$1.ddl」とします。早速、置換を実施してみましょう。
sql_table.ddl
sql_index.ddl
sql_grant.ddl
sql_synonym.ddl
readme.txt
check.sh
上記のように、sqlファイルの拡張子がddlに変わり、ファイル名の接頭に「sql_」が付加されたのではないでしょうか。何が起こったのかというと、検索対象文字列で指定した'()'内の文字列がキャプチャ(変数化)され、置換文字列の'$1'にバインドされたのです。前述の例では、”正規表現”のルールを知っていないと理解しにくいですが、逆に、数個のルールを覚えておくだけで、応用次第でかなり複雑なことも一発のコマンド実行で可能になるほど強力なツールに化けます。基本的なルールは次の表の通りです。
メタ文字 | 意味 |
. | 任意の1文字にマッチ |
[…] | リストの中の1文字にマッチ |
[^…] | リストの中に含まれていない任意の1文字にマッチ |
? | (量指定子)0~1回の繰り返し |
* | (量指定子)0回以上の繰り返し |
+ | (量指定子)1回以上の繰り返し |
^ | 行の先頭にマッチ |
$ | 行の末尾にマッチ |
\< | 単語の先頭にマッチ |
\> | 単語の末尾にマッチ |
(…) | グループの作成、単語のキャプチャ |
\t | タブ文字 |
\n | 改行文字 |
\r | 復帰文字 |
\s | 空白文字(スペース、タブ、改行、改ページ) |
\S | \s以外の文字 |
\w | [a-zA-Z0-9_]と同じ |
\W | \w以外の文字([^a-zA-Z0-9_]) |
\d | [0-9]と同じ |
\D | \d以外の文字([^0-9]) |
(?:…) | キャプチャなしのグループの作成 |
(?i) | 大文字小文字の区別をしない |
$n | n番目のキャプチャを抜き出す(置換のとき) |
”正規表現”は、ある意味新たな言語を覚えるくらいのインパクトがあり、そうまでしてでも習得する価値のある強力なツールであることは間違いありません。テキストエディタでの置換処理にとどまらず、他言語(Javaなど)で文字列処理のAPIとして採用されていたりと、活躍の場は相当幅広いです。
もし、少しでも”正規表現”に興味を持たれたのなら、書籍を通して基礎から学ぶのを激しくお勧めします。自分ももっと若いころに興味を持っていれば、それからの人生が全く違ったもの(良い方に)になったと後悔した程です。この記事を読んで頂いている方がまだ若く、下の書籍をお持ちでないなら、今すぐにポチって”正規表現”を基礎から学ぶことをお勧めします。
6月のダイエット記録 [ダイエット記録]
いろいろあって・・・
6月は会社のイベントで旅行に行って、夕食をアホほど食べたのと、情報処理試験に合格していたのが嬉しくて、アホほど食べたりしていたので、浮き沈みが激しくなりました。筋トレもサボり気味なので、身体が正直に結果を返してくれている感じです。
トータルフィットネス(TotalFitness) プッシュアップバー STT020
- 出版社/メーカー: トータルフィットネス(TotalFitness)
- メディア: スポーツ用品
TANITA タニタ 体組成計 インナースキャン50 BC-320 (パールホワイト)
- 出版社/メーカー: TANITA タニタ
- メディア: ヘルスケア&ケア用品
5月のダイエット記録 [ダイエット記録]
緩やかな減量
相変わらず筋トレや食事制限は継続しているものの、それ程ストイックなものではないです。無理をしないをモットーにしているので、1カ月で約3kgの減量は、まずまずの結果です。
残念ながら見た目の変化は少なくなりましたが、減量初期と比較すると身体が軽くなってきたのを体感できます。
月末に駆け込み減量で急激に体重が落ちているように見えますが、月を跨ぐと見事に戻ります。て言うか、増えます。。。そろそろ体重が減りにくくなってきたので、リバウンドに気を付けて過します。
トータルフィットネス(TotalFitness) プッシュアップバー STT020
- 出版社/メーカー: トータルフィットネス(TotalFitness)
- メディア: スポーツ用品
TANITA タニタ 体組成計 インナースキャン50 BC-320 (パールホワイト)
- 出版社/メーカー: TANITA タニタ
- メディア: ヘルスケア&ケア用品