正規表現

正規表現は、テキストのパターンを検索するための簡潔で応用範囲の広い表記法です。

正規表現の記法

正規表現には、次に示す3つの記法がある。

POSIX基本正規表現
POSIXの標準規格のひとつであり、Linuxのコマンドで使用される。
POSIX拡張正規表現
POSIXの標準規格のひとつである。Linuxのコマンドで使用するには、コマンドのオプションに -E を指定する。
Perlの正規表現
プログラミング言語Perlで使用される正規表現の記法。

POSIX基本正規表現

次に示すメタ文字を除いて、文字はリテラルとして扱われる。つまり、aはそのまま文字「a」を表す。

\
特別な意味を持つ文字(\.*)の前に付けると、普通の文字として扱います。
^
行の先頭を表します。
$
行の末尾を表します。
.
任意の1文字を表します。
[expr]
括弧の中のどれか1文字であることを表します。括弧の中の文字列が連続した文字の場合、最初と最後の文字をハイフン記号で繋いで表すことができます。たとえば [0123456789] は [0-9] とも表すことができます。
[^expr]
括弧の中のいずれでもない文字であることを表します。
*
0個以上の繰り返しであることを表します。
+
1個以上の繰り返しであることを表します。
\(expr\)
exprを部分式としてマークする。
\n
n(1~9)番目のマークされた部分式を参照する。

正規表現 . は、文字 .a にマッチする。

正規表現 \. は、文字 . にマッチするが、文字 a にはマッチしない。

正規表現 [ab] は、文字 ab にマッチするが、文字 cA にはマッチしない。

正規表現 [ab]x は、文字列 axbx にマッチするが、文字列 cxab にはマッチしない。

正規表現 [0-9]+ は、文字列 0256 にマッチする。

正規表現 [a-z][a-z]+ は、文字列 aabbb にマッチするが、文字列 c にはマッチしない。

正規表現 [a-z][a-z]* は、文字列 bbbc にマッチする。

正規表現 0x[0-9a-fA-F]+ は、文字列 0x800x01ef44EC にマッチする。

正規表現 [a-zA-Z][0-9a-zA-Z]* は、文字列 aZ80A にマッチするが、文字列 2x にはマッチしない。

正規表現 ^abc は、「abc def」という行の文字列 abc にマッチするが、「def abc」という行の文字列 abc にはマッチしない。

正規表現 abc$ は、「def abc」という行の文字列 abc にマッチするが、「abc def」という行の文字列 abc にはマッチしない。

POSIX拡張正規表現

拡張正規表現におけるメタ文字は、一部を除いて基本正規表現のメタ文字と同じである。基本正規表現のメタ文字とは異なる点を次表に示す。

拡張正規表現のメタ文字
メタ文字 説明
(expr) exprを部分式としてマークする。

UNIXシェルでの利用

正規表現を利用して、最初の1文字がアンダーバー以外である環境変数を表示させる例を示します。

$ env | grep ^[^_]

部分式をマークして参照する例を示す。

$ cat input.txt
foo-bar
bar-baz
foo-
-bar
$ sed "s/\(...\)-\(...\)/\2-\1/" input.txt
bar-foo
baz-bar
foo-
-bar

Perlの正規表現

メタ文字 説明
\d 数字1文字。[0-9]と同じ。
^ 文字列の先頭。[]内で使った場合、[]内以外の文字。
$ 行末
- []内で範囲を表す。
\ 直後の文字をエスケープする(メタ文字をリテラルとしてマッチさせる)。
. 改行文字を除く任意の1文字。
[] []の任意の1文字。
\D 数字以外の1文字。[^0-9]と同じ。
\w アルファベット又は数字(単語)。[a-zA-Z_0-9]と同じ。
\W アルファベットと数字以外の1文字。[^a-zA-Z_0-9]と同じ。
\s 空白文字、タブ文字又は改行文字。[\n\r\f\t]
\S 空白文字、タブ文字及び改行文字以外。[^\n\r\f\t]
pattern1 | pattern2 論理和(OR)。pattern1又はpattern2のいずれかにマッチ。
(string) 文字列をグループ化

量指定子とは、その直前の要素が連続していくつ続くかを指定する正規表現である。

メタ文字 説明
? 直前の要素が0個か1個
* 直前の要素が0個以上
+ 直前の要素が1個以上
{ m , } 直前の要素がm個以上
{, n } 直前の要素がn個以下
{m,n} 直前の要素がm個以上n個以下

たとえば、正規表現「 (abc)+ 」は文字列「 abc 」、「 abcabc 」及び「 abcabcabc 」などにマッチする。

正規表現の例

さまざまなものをPerlの正規表現で表した例を示す。

FQDN
[\w-]+(\.[\w-]+)+
Javaの識別子
[A-Z_a-z][0-9A-Z_a-z]*
URL
https?:[\w/#%\.\-\?]+
メールアドレス
^[\w\.\-]+@[\w\.\-]+