CTC 教育サービス
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes
前回はパイプとgrepについて述べました。
今回は、grepで使用する正規表現について詳しく説明しようと思います。正規表現はgrep以外でもperl/python/php/rubyなどのスクリプト言語でも使用しますが、それぞれ微妙に異なります。
まずは、grepやsedで使用するPOSIX標準の正規表現について説明しようと思います。
POSIXには基本正規表現と拡張正規表現があります。通常のgrepは基本正規表現を使用します。
正規表現は、メタ文字と通常文字(リテラル)の組み合わせでマッチする文字列を指定します。
| メタ文字 | 意味 |
|---|---|
| ^ | 文字列の先頭 |
| $ | 文字列の末尾 |
| . | 任意の1文字にマッチする |
| [...] | []内に含まれる文字にマッチする<br />a-zや0-9のように範囲指定が可能だが、文字ではなく文字コードで範囲を指定している |
| [^...] | [^]内に含まれない文字にマッチする |
| \(\) | 包括指定子。()で囲まれた範囲をブロックとして扱う |
| * | 直前の文字またはブロックの0回以上の繰返し |
| \{m,n\} | 直前の文字またはブロックのm回以上、n回以下の繰り返し<br />mのみの場合はm回の繰り返し、,mの場合はm回以下の繰り返し、m,の場合はm回以上の繰り返しとなる |
| \n | 後方参照子。n番目の\(\)の条件にマッチした文字列 |
| \x | x自身を表す。上記メタ文字自身にマッチする。\\で\にマッチする |
この説明だけでは理解できないと思いますので、いくつか例を上げて説明します。
echo 文字列 | grep 正規表現 もしくは echo 文字列 | egrep 正規表現と実行すると、マッチした部分に色がついてわかりやすいと思います。
正規表現の先頭に^がある場合は、文字列の先頭である場合にマッチし、正規表現の末尾に$があるときは文字列の末尾にマッチします。そのため、以下のようになります。
| 文字列 | 正規表現 | マッチ |
|---|---|---|
| abcd | ^abc |
○ |
| Abcd | ^abc |
× |
| bcd | a^bc |
× |
| a^bcd | a^bc |
○ |
| abcde | e$ |
○ |
| abcd | e$ |
× |
| abcde$ | e$ |
× |
| abc | ^ |
○ |
| abc | $ |
○ |
.は任意の1文字にマッチします。
| 文字列 | 正規表現 | マッチ |
|---|---|---|
| abcdef | ab.d |
○ |
| abcdef | ab.c |
× |
| abcd | .... |
○ |
[文字列]は、文字列内の1文字にマッチします。
| 文字列 | 正規表現 | マッチ |
|---|---|---|
| abcd | [abc] |
○ |
| abcd | a[cde] |
○ |
| abcd | a[sxz] |
× |
| abcd | ab[def] |
× |
[A-Z]のように、範囲指定も可能です。この文字の範囲は文字コード順に従います。そのため、[z-a]のような指定は無効になります。 [-abc]や[xyz-]のような指定の場合は、abcに-を含んだ文字指定となります。また、[a-fxy ]のように、範囲と文字を組み合わせた指定も可能です。
| 文字列 | 正規表現 | マッチ |
|---|---|---|
| abcd | [a-z] |
○ |
| abc012 | [0-9] |
○ |
| abcde | [0-9] |
× |
| abcdef012 | [g-z][12] |
× |
| abc01 | [A-Z0] |
○ |
*は前の文字もしくはブロックの0以上の繰り返しになります。\{m,n\}はm回以上、n回以下の組み合わせです。例えば、.*は、空文字列を含むすべての文字列にマッチします。
| 文字列 | 正規表現 | マッチ |
|---|---|---|
| abcdefg | [a-z]* |
○ |
| abcdefg | [A-Z]* |
× |
| abcdefg | ^[a-z]\{1,7\}$ |
○ |
| abcdefg | ^[a-z]\{1,6\}$ |
× |
また、文字コードの違いでアルファベットの範囲が異なったりするため、POSIXクラスというものが存在します。
| POSIXクラス | 正規表現 | 意味 |
|---|---|---|
[[:digit:]] |
[0-9] |
数字 |
[[:xdigit:]] |
[0-9A-Fa-f] |
16進数字 |
[[:alpha:]] |
`[A-Za-z] | アルファベット |
[[:upper:]] |
[A-Z] |
アルファベット大文字 |
[[:lower:]] |
[a-z] |
アルファベット小文字 |
[[:alnum:]] |
`[A-Za-z0-9] | アルファベットと数字 |
[[:blank:]] |
[ \t] |
スペースとタブ |
[[:space:]] |
[ \t\n\r\f\v] |
空白文字 |
[[:cntrl:]] |
制御文字 | |
[[:graph:]] |
[^ \t\n\t\f\v[:cntrl:]] |
印字文字 |
[[:print:]] |
`[ ^\t\n\t\f\v[:cntrl:]] | 印字文字とスペース |
egrepで使用される拡張正規表現では、以下のメタ文字が追加・変更されています。
| 基本正規表現 | 拡張正規表現 | 意味 |
|---|---|---|
| + | 直前の文字もしくはブロックの1回以上の繰り返し | |
| ? | 直前の文字もしくはブロックの0か1回の繰り返し | |
| ABC|DEF | ABCもしくはDEFの文字列(リテラル) | |
\(...\) |
(...) |
包括指定子 |
\{m,n\} |
{m,n} |
範囲指定 |
これら正規表現は、grep/egrepやsed/awk/vi/more/less など多くのUNIXコマンドで使用する機会が多いです。また正規表現の考え方は、python/rubyなどを始めとした現在でも多く使われるスクリプト言語で通用する考え方ですので、覚えておいて損はないです。
では、次回もお楽しみにお待ち下さい。
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes