紹介
システム管理者、開発者、QAエンジニア、サポートエンジニアなど、ファイルから特定のパターン(特定の範囲に属するIPアドレスのセット、時間スタンプの範囲、ドメインまたはサブドメイン名のグループなど)を見つける必要があります。また、ファイル内の特定の方法で綴られた単語を見つけたり、ファイル内の可能性のある誤字を見つける必要がある場合もあります。これが正規表現の出番です。
正規表現は、パターンに一致(またはパターンに一致しない場合もあります)するテンプレートです。テキストを記述および解析する方法を提供します。このチュートリアルでは、特定の言語の詳細には立ち入らず、概念を説明するために単にegrepを使用します。
正規表現
正規表現には2種類の文字があります:
-
通常のリテラル文字と
-
メタ文字
これらのメタ文字は、正規表現にパワーを与えるものです。
次の国.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
グルーピングメタキャラクターと代替
AsiaまたはAfricaを含むすべての行を一致させるには:
$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia
これは、Aとaを共通して取ることでもできます。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
上記の式を見ると、
-
灰色は、greyまたはgrayとして綴ることができます
-
色はcolourまたはcolorと書くことができます。つまり、uはオプションなので、u?を使用します。
-
同様に、お気に入りまたはfavoriteは、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です。
単語境界
unicolor、watercolor、multicolorなど、colorで終わる単語を一致させるパターンを書くために、これらの例を試してみてください。
$ egrep 'color\>'
次に、unicolor、watercolor、multicolorなどではなく、colorlessまたはcolorfulを一致させます。
$ egrep '\<color'
したがって、正確な単語colorを一致させるには、以下のようにします:
$ egrep '\<color\>'
バックリファレンス
ダブルタイプされたすべての単語をマッチさせたい場合、例えば the the や before before のように、バックリファレンスを使用する必要があります。バックリファレンスはパターンを記憶するために使用されます。
以下は例です:
$ egrep "\<the\> \1"
また、一般的な方法は次のとおりです:
$ egrep "\<(.*)\> \1"
上記の例は、名前の最初と最後の部分が同じ場合にすべての名前を見つけるために使用できます。括弧が複数ある場合、2番目、3番目、4番目などは \2、\3、\4 などで参照できます。
これは正規表現の強力さへの紹介に過ぎません。
Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions