この記事では正規表現を知らない方に向けて簡単な例と共に解説します。必要最小限な所だけをまとめましたので初学者の方は他の文献を見る前にまずこの記事を読むことをおすすめします。
例として、grepと正規表現を用いて文書内の検索を行います。grepにはEオプションを指定し、正規表現(拡張正規表現)を使うことを明示します。コマンド実行はAlmaLinux 8.7上で行いました。
目次
正規表現とは
まず、正規表現とは何なのか簡単に説明をしていこうと思います。
正規表現を端的に言うと、「文字列の集合を一つの文字列で表現する方法の一つ」(Wikipedia)です。つまり、いくつかの文字列を一つの文字列で表すことができる方法ということです。
これだけだとあんまりピンとこないと思いますので、具体例を挙げていきます。例えば、とある文書においてlistとliftの両方を検索する場合を考えます。普通に検索しようとすると、 listとlift で2回検索を行わなければなりませんが、ここで正規表現を使うと、 list と lift は li[sf]t と表すことができ、1回で検索を行うことが出来ます。ここで、[ ]はメタ文字と呼ばれ、正規表現において特別な意味を持った文字を指します。メタ文字は[ ]だけでなく、以下の表に示すように様々な種類があります。
メタ文字 | 意味 |
^ $ | 行の先頭、最後 |
. | 任意の一文字 |
[ ] | 指定した文字のどれか一文字 |
[^ ] | 指定した文字以外 |
| | または |
* + ? | 直前の文字の繰り返し |
{ } | 直前の文字の指定した回数の繰り返し |
( ) | グループ化 |
\ | メタ文字の打ち消し |
これらのメタ文字を用いて正規表現のパターンを記述していきます。ただこの表だけを見てもよく分からないと思いますので、それぞれのメタ文字について詳しく解説していきます。
行の先頭 ^ と最後 $
^ は行の先頭を、 $ は行の最後を示します。行の先頭、最後にあるワードを検索したいときに使います。
例えば、このようなファイルがあったとして、
普通にgrepを用いて abc の検索を行うと、
もちろん全てが合致します。
次に、行の先頭を示す ^ を使うと、
行の先頭にあるabcだけが合致します。
また、行の最後を示す$を使うと、
行の最後にあるabcだけが合致します。
任意の一文字 .
.(ピリオド)は任意の一文字(なんでも良い一文字)を示します。
例えば、このようなファイルがあったとして、
普通に abc を検索すると
もちろん abc だけが合致します。
次に、 a.c を用いると、
.(ピリオド)が任意の一文字(なんでも良い一文字)を示しますので、abcとadcが合致します。
指定した文字のどれか一文字 [ ]
[ ] の中に文字を指定することでその中のどれかの一文字を示すことが出来ます。例えば、 [abc]で検索を行うと、
[abc] の部分がaとbとcを指しますので、このような結果になります。
また、 [abc] は [a-c] と書くことができます。
これと同じように、小文字のアルファベットは[a-z]、大文字のアルファベットは[A-Z]、数字は[0-9]と書くことが出来ます。
例えば、このようなファイルがあったとすると、
上記の例は以下のようになります。
小文字だけが合致しています。
大文字だけが合致しています。
数字だけが合致しています。
指定した文字以外 [^ ]
[^ ] の中に文字を指定することでその文字以外を指すことが出来ます。例えば、a以外を指定したかったら、[^a]とします。
大文字のアルファベット以外を指定したかったら、[^A-Z]とします。
または |
| は、またはを示します。例えば、 Happy|2023 とすると、 Happy か 2023 のどちらかを示しますので、
このようになります。
ちなみに2つだけでなく、何個も指定可能です。
この例では Happy と 2023 と New のどれかを示しています。
直前の文字の繰り返し * + ?
直前の文字の繰り返しには * 、 + 、 ? の3つがあります。しかし、それぞれのメタ文字において、直前の文字の繰り返す数が異なっています。それをまとめたものが以下の表になります。
正規表現 | 直前の文字の繰り返し数 |
* | 0回以上 |
+ | 1回以上 |
? | 0回または1回 |
このように、 * では直前の文字を0回以上、 + は1回以上、 ? は直前の文字を0回か1回繰り返します。
例えば、このようなファイルがあったとして、
ab*c とすると、
b が0回以上繰り返されるため、全てのパターンに合致します。
次に、 ab+c とすると、
b が一回以上繰り返されるため、 ac 以外のパターンに合致します。
また、 ab?c とすると、
b を0回、または1回繰り返すことを示しますので、始めの2つのパターンに合致します。
直前の文字の指定した回数の繰り返し { }
{ } の中に任意の数字を入れることで直前の文字を繰り返すことが出来ます。上記の例では0回以上や1回以上を示すものがありましたが、今回では繰り返す回数を指定することが出来ます。例えば、上記の例でbが2回繰り返されている文字列を検索したい場合は、 ab{2}c を用います。
また、3回繰り返されている文字列を検索したい場合は、 ab{3}c を用います。
グループ化 ( )
( ) はグループ化を示します。 ( ) でくくることで、任意の数文字を一つの単位として扱うことが出来ます。
例えば、このようなファイルがあったとして、
普通に abc を検索すると、
このようになります。
次に、 ab をグループ化し、前の文字を0回以上繰り返すことを示す * をつけると、
abを0回以上繰り返すということになりますので、全てに合致します。
また、前の文字を2回繰り返すことを示す {2} をつけると、
ab が2回繰り返されますので、 ababc に合致します。
メタ文字の打ち消し ¥
¥ はメタ文字の意味を打ち消します。メタ文字というのは正規表現において特別な意味を持った文字であり、先に挙げた * や $ などを指します。メタ文字の前に ¥を付けることで、その意味を打ち消すことが出来ます。
例えば、このようなファイルがあったとして、
この中からピリオドを検索したいと思います。これをそのまま検索文に指定すると、
全てが合致してしまいます。これは、 . (ピリオド)が任意の一文字を示すメタ文字だからです。これを避けるために、 . (ピリオド)の前にメタ文字の打ち消しを意味する ¥を前に付けます。
そうすると、任意の一文字という意味が打ち消され、ただのピリオドを示すことになり、望んだ検索を行うことが出来ます。
おわりに
今回は正規表現について具体例と共に解説しました。正規表現は、ログデータの分析や、文書の一括変換など、様々な場面で活用でき、とても便利な手法です。今回は必要最小限の正規表現をまとめましたが、この他にもたくさんの種類がありますので調べていただくとより理解が深まると思います。それでは長くなってしまいましたが、ここまで読んでくださり、ありがとうございました。
参考文献
記載されている会社名、システム名、製品名は一般に各社の登録商標または商標です。
当社製品以外のサードパーティ製品の設定内容につきましては、弊社サポート対象外となります。