正規表現をとにかく丁寧に解説する

正規表現をとにかく丁寧に解説する

目次

はじめに
そもそも正規表現ってなに?
まずは簡単な正規表現から
肯定先読みと否定先読みを使う
終わりに

はじめに

「正規表現」、コーディング中だけでなく、SQL文を一括で作成する際などによく使いますが、よく使う正規表現はメモ帳に保管していたり、その都度ググっていました。よくよく調べてみると、正確に理解していなかった部分が多かったので、頭の中を整理するためにも、全く知らない方にも分かるように解説してみます。

そもそも正規表現ってなに?

辞書的な意味を調べてみると
「正規表現(Regular Expression)」とは、文字列の集合を一つの文字列で表現する方法の一つである。】
とこのような説明が出てきます。

また、【文字列のパターンを表現する表記法 】という説明や、【正規表現は、通常の文字 (a ~ z など) と、
“メタキャラクタ” という特殊文字から構成される文字列のパターン】といった説明が出てきます。

文字列の集合を一つの文字列で表現する、という部分がとても分かりにくいですが、
【abcdefg】や【My name is John 】といった文字列を一つ(ここが大切)の文字列で表す方法です。

では、x = “abcdefg”だとすると、xは正規表現なのか、答えはNoです。
そのものを指定することは「リテラル」といいます。

【文字通り】、【字義通り】といった意味があります。
そういえば、型が違うときに【リテラルと書式文字列が一致しません】などのエラーが出ることがよくあると思いますが、定数の意味もあるので腑に落ちました。

ここで、【文字列のパターンを表現する表記法 】という説明や、【正規表現は、通常の文字 (a ~ z など) と、
“メタキャラクタ” という特殊文字から構成される文字列のパターン】
といった説明が効いてきます。

つまり、文字をそのまま指定するのではなく、パターンとして、通常の文字 (a ~ z など) と、
“メタキャラクタ”によって置き換えることが出来ることが【正規表現】の定義と言えます。

パターンを表している一番分かりやすい例がワイルドカード【*】だと思います。
どのような値でも良いという【パターン】を表している、と考えると分かりやすいかと思います。
ちなみに【*】のような文字をメタキャラクタやメタ文字と呼びます。

まずは簡単な正規表現から

前置きが長くなりましたが、【パターン】を置き換えることが出来る正規表現は、正規表現同士を組み合わせることで、本当に便利です。
まず簡単な正規表現から。

  • メタ文字での置き換え(例:ピリオド【.】)

メタ文字で置き換える例として、半角の.は任意の一文字に置き換わります。
例えば、【パンプキン(pampkin)】と【還付金(kampkin)】は【.ampkin】と表せます。

  • 文字種を限定して置き換え(例:\w)

【.】のように任意の一文字ではなく、ある程度文字種を限定させて置き換えることが出来ます。
例えば、\dは0-9の数字一文字を表しますが、\wはa-z、A-Z、0-9、_ の内の 1 文字を表すことが出来ます。
【パンプキン(pampkin)】と【還付金(kampkin)】は【\dampkin】と表せませんが、
【\wampkin】では表せます。

肯定先読みと否定先読みを使う

さてやっとよく使う組み合わせの部分に移ります。
個人的な主観なのですが、業務中に使用する正規表現で圧倒的に多いのが、肯定先読みと否定先読みだと思います。
実際には、「東京」や「大阪」など固定値を置き換えるよりも「東京」で始まる●●、や文字列の中のどこかに「大阪」が含まれるものが知りたい、ということの方が多いと思います。
そんなときに使用するのが、肯定先読みや否定先読みです。

  • 肯定先読み(?=regex)

肯定先読みの辞書的な意味は「処理位置の前方方向に向かって文字列の吟味(Assertion)を行う」とあります。
全く分からないので、例を出します!

例えば、「トマト」で始まる文字列であれば、【^(?=トマト).*$】と記載します。
まず、^は文頭を表し、(?=トマト)が肯定先読みの部分です。続いて.は任意の1文字。*は直前の1文字の0回以上の繰り返し、.(任意の1文字)を0回以上繰り返すという意味です。最後に$は文末の意味。
これで「トマトジュース」も「トマトケチャップ」も引っかかります。

「トマト」を含む文字列は【^(?=.*トマト).*$】で表します。
さっきの【^(?=トマト).*$】と比較すると分かりやすいです。
トマトの前に.*をつけることで、任意の1文字の繰り返しの中にトマトという文字が入っていることを表現できます。

  • 否定先読み(?!=regex)

これは肯定先読みの逆なので簡単です。
「トマト」を含まない文字列は【^(?!=.トマト).*$】で表します。

例えば、文頭にpublicが入っているものだけほしい、などの時に使えます。
【^(?!=public).*$】を空白で置換します。


最後に

なんか正規表現置き換わってくれないな、って思うことが結構ありますが、ほぼ9割ぐらいがエスケープを忘れていることが多いです。例えば、コーディング中にもよくあるかと思いますが、ファイル名などの【file_name.xls】の【.】の部分は、エスケープします。【\】をつけることで【.】はメタ文字ではなくて、【.】という文字です、ということが表現できます。
なので、【file_name\.xls】とする必要があります。

良かったら参考にしてくださいねのコーナー

本当に最後に、個人的に業務でよく使う正規表現と、先輩が良く使っている正規表現をご紹介します。

  • タブに置換してエクセルで見やすくする。(^.*?)(:)を$1#\tに置換

例えば、ログで出力されたファイルがこのような形式だったとします。前後が:で区切られているものです。

とっても見ずらいですが、(^.*?)(:)を$1\tに置換すると、まずはこのようになります。

そしてこれをExcelで開くと、

あら見やすい!また、編集しやすくもなります!!

  • 改行コードを’,’に置換してSQLにつかう

例えば、このような形で、エクセルでデータを受領したとします。

このデータをテキストにすると、このように改行コードで表記されます。

ここで、[\n\r]+を’,’に置換すると、このようになります。

これならこのままSQLのIN (の後に挿入できます。

皆様の正規表現の理解に少しでもお役に立てれば幸いです。ありがとうございました。