正規表現の概要
序章
システム管理者、開発者、QAエンジニア、サポートエンジニアなどとして。 ファイルから、特定の範囲またはタイムスタンプの範囲に属するIPアドレスのセット、ドメイン名またはサブドメイン名のグループなど、特定のパターンを見つける必要があります。 また、特定の方法で綴られた単語を見つけたり、ファイル内でタイプミスの可能性を見つけたりする必要があるかもしれません。 これが正規表現の出番です。
正規表現は、パターンに一致する(またはパターンに一致しない場合もある)テンプレートです。 これらは、テキストを記述および解析する方法を提供します。 このチュートリアルでは、言語の特殊性に立ち入ることなく、正規表現についての洞察を得ることができます。 概念を説明するためにegrepを使用します。
正規表現
正規表現は、次の2種類の文字で構成されます。
-
通常のリテラル文字と
-
メタ文字
これらのメタ文字は、正規表現に力を与えるものです。
次のcountry.txtファイルについて考えてみます。最初の列は国名、2番目の列は国の人口、3番目の列は大陸です。
$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia
アンカーメタ文字
ここで説明する「メタ文字」の最初のグループは、^と$です。 ^と$はそれぞれパターンの開始と終了に一致し、アンカーメタ文字と呼ばれます。
国名がIで始まるすべての国の名前を見つけるには、次の式を使用します。
$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe
または、eで終わる大陸名を持つすべての国を見つけるには、次のようにします。
$ egrep 'e$' country.txt
Italy,57634327,Europe
次のメタ文字はドット(。)で、1文字と一致します。 国名が正確に5文字の長さのすべての行に一致させるには:
$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia
国名がIまたはJで始まり、国名が5文字のすべての行を検索するのはどうですか?
$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia
[…]は、文字セットまたは文字クラスと呼ばれます。 文字セット内では、指定された文字の1つだけが一致します。
文字セット内の^は、文字セットを無効にします。 次の例は、5文字の長さで、IまたはJで始まらない国名と一致します。
$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia
グループ化のメタ文字と交代
アジアまたはアフリカを含むすべての行に一致させるには:
$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia
これは、Aとaを共通にすることによっても実行できます。
$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia
数量詞
書く代わりに
$ egrep '^[IJ]....,' country.txt
私たちは書くことができます
$ egrep '^[IJ].{4},' country.txt
ここで、{}は数量詞と呼ばれます。 それらは、それらの前のキャラクターが何回出現するかを決定します。
範囲も指定できます。
$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia
これは、IまたはJで始まり、その後に4〜6文字の付いた国名と一致します。
数量詞に使用できるショートカットがいくつかあります。 例えば、
{0,1}は?と同等です
$ egrep '^ab{0,1}c$' filename
と同じです
$ egrep '^ab?c' filename
{0、}は*と同等です
$ egrep '^ab{0,}c$' filename
と同じです
$ egrep '^ab*c' filename
{1、}は+と同等です
$ egrep '^ab{1,}c$' filename
と同じです
$ egrep '^ab+c' filename
これまでに見た表現を含むいくつかの例を見てみましょう。 ここでは、ファイルから検索する代わりに、標準の入力から検索します。 私たちが使用するトリックは、grep(またはegrep)がパターンを検索することを知っていることです。パターンが見つかった場合は、そのパターンを含む行全体が表示されます。
灰色のスーツが彼のお気に入りであるという文を綴るすべての可能な方法を見つけたいと思います。
式は次のようになります。
$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite
the gray colour suit was his favorite
the gray colour suit was his favorite
上記の式を見ると、次のことがわかります。
-
灰色は灰色または灰色として綴ることができます
-
色は色または色として書くことができます。つまり、uはオプションなので、uを使用しますか?
-
同様にお気に入りまたはお気に入りはfavou?riteと書くことができます
米国の郵便番号を照合するのはどうですか?
$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456
83456-
834562
92456-1234
92456-1234
10344-2342-345
24時間制のすべての有効な時刻を照合するもう1つの例。
$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02
33:45:11
15:45:33
15:45:33
上記の例では、時間の最初の桁が0または1の場合、2番目の桁は0から9のいずれかになります。 ただし、最初の桁が2の場合、2番目の桁に許可される値は0、1、2、または3です。
単語の境界
単色、水彩、多色など、色で終わる単語に一致するパターンを書くこと。 一致していますが、無色またはカラフルではありません。 これらの例を自分で試して、それらに精通してください。
$ egrep 'color\>'
次に、無色とカラフルに一致しますが、単色、水彩、多色などには一致しません。
$ egrep '\<color'
これにより、単語の色を正確に一致させるために、次のことを行います。
$ egrep '\<color\>'
後方参照
、、 before のように、二重に入力されたすべての単語を一致させたい場合は、後方参照を使用する必要があります。 後方参照は、パターンを記憶するために使用されます。
次に例を示します。
$ egrep "\<the\> \1"
または一般的な方法:
$ egrep "\<(.*)\> \1"
上記の例を使用して、名前と名前が同じであるすべての名前を検索できます。 括弧のセットが複数ある場合は、2番目、3番目、4番目など。 \ 2、\ 3、\4などで参照できます。
これは、正規表現の力の紹介にすぎません。