いずれか一文字にマッチする:角括弧([...])

広告
eyecatch

正規表現で使用するメタ文字の一つである角括弧([...])の使い方について解説します。角括弧の中に記述した複数の文字のいずれか一つにマッチします。文字クラスとも呼ばれます。

角括弧([...])の使い方

角括弧([...])は角括弧の中に記述した複数の文字のいずれか一つにマッチさせる場合に使用するメタ文字です。

[...]

例えば次のような正規表現のパターンで考えてみます。

D[aio]m

"D" 、 "a" または "i" または "o" のいずれかの文字、 "m" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Dam
〇 Dim
〇 Dom
× Dem
× Daim

このように指定した複数の文字のいずれかにマッチさせたい場合に使用します。

キャレット(^)を使った否定

角括弧[]を使用する時に先頭にキャレット(^)を記述すると、角括弧の中に記述した複数の文字以外の文字にマッチするようになります。

[^...]

例えば次のような正規表現のパターンで考えてみます。

D[^aio]m

"D" 、 "a" および "i" および "o" 以外のいずれかの文字、 "m" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 Dcm
〇 Dzm
〇 D4m
× Dam
× Dim
× Dom
× Daim

なおキャレット(^)は角括弧[]の一番最初に記述した場合だけ否定の意味になります。その他の位置でキャレット(^)を記述した場合は文字そのもののキャレット(^)の意味になります。

ハイフン(-)を使った範囲の指定

角括弧を使用したパターンでは連続した文字を指定する場合がよくあります。次のような正規表現のパターンをみてください。角括弧の中に 0 から 9 までの連続した文字が記載されています。

201[0123456789]年

"2" 、 "0" 、 "1" 、 "0" から "9" までのいずれか一文字、 "年" 、と続くパターンとなります。このパターンとマッチする文字列は例えば次のようなものになります。

〇 2010年
〇 2011年
〇 2012年
〇 2013年
〇 2014年
〇 2015年
〇 2016年
〇 2017年
〇 2018年
〇 2019年
× 2020年

このように 0 から 9 までのいずれかの数字一文字といった場合や、 a から z までのいずれかの小文字のアルファベット一文字にマッチさせたいというケースはよくあります。

0から9までの数値:
[0123456789]

aからzまでの小文字のアルファベット
[abcdefghijklmnopqrstuvwxyz]

AからZまでの大文字のアルファベット
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]

そして上記のように文字コード上で連続している文字であればハイフン(-)を使って [0-9] や [a-z」 のように範囲指定を使った記述を行えます。

0から9までの数値:
[0123456789] <==> [0-9]

aからzまでの小文字のアルファベット
[abcdefghijklmnopqrstuvwxyz] <==> [a-z]

AからZまでの大文字のアルファベット
[ABCDEFGHIJKLMNOPQRSTUVWXYZ] <==> [A-Z]

ハイフンを使った範囲指定の記述方法を使うことで最初に記載した正規表現のパターンは次のように表現することができます。

201[0-9]年

範囲指定は [3-7] や [d-m] のように一部分だけの範囲でも指定できます。また他の文字や範囲指定と組み合わせて [a-dfgk] や [0-9a-f] のような表現もできます。

[3-7] <==> [34567]
[a-dfgk] <==> [abcdfgk]
[0-9a-f] <==> [0123456789abcdef]

なお文字コード上で連続していると記載しているのは、例えば数字であればたまたま "0" から "9" までが文字コード上で順番に並んでいるので "0" の文字から "9" の文字までの範囲の文字という意味で [0-9] と表現することができました。

全角のひらがなは "あ" から "ん" までが "あいうえお・・・ん" と文字コード上で順番に並んでいるわけではなく、例えば Unicode の文字コードであれば全角ひらがなは「ぁあぃいぅうぇえぉおかがきぎ ・・・ ゎわゐゑをん」のように並んでいますので [あ-ん] と表現すると想定していたものよりもたくさんの文字がマッチするかもしれません。

角括弧の中でのメタ文字の扱い

正規表現のパターンではドット(.)やプラス(+)やドル記号($)などはメタ文字として特別な意味を持ちますが、角括弧の中で記述された場合は単なる文字として扱われます。例えばパターンとして [a.$] のように表現されていた場合は "a" か "." か "$" のいずれか一つにマッチします。

ただし例外がありバックスラッシュ(¥)、ハイフン(-)、キャレット(^)、終わり角括弧(])の4つについては特別な文字として扱われます(バックスラッシュ以外は記述した位置によっては単なる文字として扱われます)。

ハイフン(-)は [a-z] のように範囲の指定として使われるため、文字としてハイフンを使用したい場合にはバックスラッシュを使って ¥- と記述する必要があります。ただし角括弧の先頭または最後に記述した場合はバックスラッシュは不要です。

[abc¥-def]
[-abcdef]
[abcdef-]

キャレット(^)は角括弧の先頭に記述すると [^abc] のように「・・・ではない」という否定の意味で使われます。角括弧の先頭以外に記述した場合はバックスラッシュは不要です。

[¥^abcdef]
[abc^def]

終わり角括弧(])は角括弧の終わりを意味するので、文字として使用する場合にはバックスラッシュを使って ¥] と記述する必要があります。ただ例外として角括弧の先頭に記述した場合はバックスラッシュは不要です(ただし記述ミスのようにも見えますのでバックスラッシュによるエスケープを行う方がいいかもしれません)。

[abc¥]def]
[]abcdef]

バックスラッシュ(¥)を文字として使用する場合はどこに記述する場合でもバックスラッシュを使って ¥¥ と記述する必要があります。

[abc¥¥def]

-- --

正規表現で使用するメタ文字の一つである角括弧([...])の使い方について解説しました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。