正規表現

Linux


正規表現とは要するに文字列を指定する方法です。

任意の1文字「.」

まずは任意の1文字と一致する「.」です。
例:「1.3」は「1で始まって3で終わる3文字の文字列」を表す。113、193、1a3など
\を直前に置かれた文字は特別な意味を失い、そのままの文字を意味することになります。正規表現でファイル名を指定するときに「main.c」と書くと
目的の「main.c」にもマッチしますが、「main2c」などといったファイル名にもマッチしてしまいます。
正確を期すためには「main\.c」と書かなければなりません。

0回以上の繰り返し「*」

正規表現でも同じ文字を使います。ただし、その意味が微妙に違います。ワイルドカードでは「任意の複数文字に一致」ですが、
正規表現では「直前の文字を0回以上繰り返したものに一致」です。
ですから、Windowsでファイルを指定するときなどの「*」と同じ意味にするには「..*」と書かなければなりません。
これを「.*」としてしまうと、「任意の1文字を0回以上繰り返したものに一致」になって、結局文字がなくても一致してしまいます。
例:「ab*c」が一致するのは、ac、abc、abbc、abbbcなど


直前の文字の0~1回の繰り返し「?」

「?」も似たようなものです。Windowsのワイルドカードとは違って、「直前の文字を0回または1回繰り返したものに一致」します。
例:「AB?C」に一致するのは、ACかABC


直前の文字の1回以上の繰り返し「+」

さすがにこれでは使いにくいと思った人がいたのか、最近では「直前の1文字を1回以上繰り返したものに一致」する「+」が使えるプログラムが増えています。
例:「ab+c」に一致するのは、abc、abbc、abbbcなど。acには一致しない

行頭「^」と行末「$」

文字ではなく、行の先頭に一致するのが「^」、終わりに一致するのが「$」です。冒頭で述べたように、行の最初や最後にある余分な空白を削除するときなどに便利です。
「 *」(「*」の前に半角スペースが2個あることに注意)だと、1文字以上の空白すべてに一致してしまいます。
日本語は分かち書きをしないので文中に空白が入ることは少ないのですが、英単語を並べたり、プログラムを作ったりしているときはいくらでも空白が入ります。
そこで行頭の空白を指定するには「^ *」(「^」と「*」の間に半角スペース2個)
行末の空白を指定するには「 *$」(「*」の前に半角スペース2個)としてやります。


どれかに一致「[]」

任意の1文字ではなく、特定の文字に一致してほしいときもあります。特定の文字列ならそのままつづればOKですが
例えば「母音だけが並んだ文字列」を指定したいときはどうすればよいのでしょうか。この場合は「[」と「]」を使います。
この2つで挟むと、「中に並べられた文字のどれかに一致」という意味になります。先ほどの「母音だけが並んだ文字列」なら
[aiueo][aiueo]*
同じものを2つ並べているのは、前述のように「*」が「0回以上の繰り返し」を意味するからです。ここでも「+」が使えれば
[aiueo]+


もし、並べる文字に規則性があるなら、省略形も使えます。始まりの文字と終わりの文字をハイフンでつなげればよいのです。
[a-z]とすれば英小文字のいずれか、「[0-9]」とすれば数字のいずれかに一致します。
日本語化されたプログラムなら漢字でも同じことができますが、正確にいうとこれは文字コードの順で並んでいるときにしか使えません。
[一-九]くらいならまだしも、普通の漢字ではぱっと見には分かりませんね。

[a-zA-Z][a-zA-Z]*

[a-zA-Z0-9_\-][a-zA-Z0-9_\-]*

変数名や関数名に一致、といったところでしょうか。場合によってこれを「\w」で表せることもあります。

いずれかの文字以外(否定)「[^」

「いずれかの文字」ではなく、「いずれかの文字以外」という指定もできます。この場合は「[」の直後に「^」を置きます。

[^aiueo]  「母音以外の1文字」ということになるわけです。

複数パターンのいずれか「|」

abc|def

「abc」か「def」のどちらかに一致します。ただし、処理系によって「|」だったり「\|」だったりするので注意が必要です。


応用編

時として、「一致する回数を指定する」という表現をしたくなります。
プログラム言語によっては変数名の長さに制限があり、例えば制限が8文字だったとしましょう。
9文字以上の変数名でエラーを起こしてくれればましなのですが、間抜けな処理系だとエラーを起こさず実行できるくせに、先頭8文字しか判別に使わない、などということがあります。
最近は分かりやすいように長い変数名を使うのが一般的ですから、先頭8文字が一致した変数もあり得ます。
[a-zA-z0-9_-]{9,}

「{n}」で直前のパターンをn回繰り返し、「{n,}」だとn回以上、「{n,m}」ではn回以上m回以下を意味します。
$ egrep "[a-zA-Z][a-zA-Z0-9_]{9,}" *.c

Cでは変数名や関数名の先頭は英数字。これに英数字かアンダースコアが続く)。
これで怪しいところに見当をつけられますから、そこに関連する部分に絞り込んで調査するわけです。


グループにまとめる

正規表現をグループ化するには、「(」と「)」でくくります。

(abc)+(def)+

「abcを1回以上繰り返した後にdefを1回以上繰り返したもの」になるわけですが、処理系によっては使えないこともあるので確認が必要です。
また、「\(」と「\)」だったりもします。こちらの表記では、後方参照時に使うためのグループ化であることもあります。
後方参照とは、実際に一致した文字列を表すためのものです。
具体例を挙げると、「dat」に対して「\([abc]\)」でパターンマッチをかけると、「\1」と書くことで「a」が取り出せます。

  • 最終更新:2017-02-18 13:19:23

このWIKIを編集するにはパスワード入力が必要です

認証パスワード