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

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

(Last modified: )

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

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

[...]

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

D[aio]m

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

〇 Dam
〇 Dim
〇 Dom
✕ Dem
✕ Daim

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

サンプル

JavaScript を使って簡単な正規表現のサンプルを作成してみます。

const regex = /D[aio]m/;

regex.test('Dam');
--> true
regex.test('Dim');
--> true
regex.test('Dom');
--> true
regex.test('Dem');
--> false
regex.test('Daim');
--> false

角括弧の中のいずれか一つにマッチする:角括弧([...])(1)

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

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

[^...]

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

D[^aio]m

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

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

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

キャレットのすぐ後ろの文字だけを否定するのではなく、角括弧[]の中のすべての文字を否定する点に注意してください。

サンプル

JavaScript を使って簡単な正規表現のサンプルを作成してみます。

const regex = /D[^aio]m/;

regex.test('Dam');
--> false
regex.test('Dim');
--> false
regex.test('Dzm');
--> true
regex.test('D4m');
--> true
regex.test('Dazm');
--> false

角括弧の中のいずれか一つにマッチする:角括弧([...])(1)

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

角括弧 [] を使用したパターンでは連続した文字を指定する場合がよくあります。次のような正規表現のパターンをみてください。角括弧の中に 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までの数値
[0-9]

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

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

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

201[0-9]年

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

3から7までの数値
[3-7]

aからdまでとf,g,k
[a-dfgk]

0から9までとaからzまで
[0-9a-f]

角括弧とハイフンを使った指定範囲のいずれか一つの文字とマッチさせるパターンについて、バックスラッシュ( \)+1 文字を使った略記法が用意されているものがあります。詳しくは「バックスラッシュ(\)+文字を使った文字集合のいずれか一文字とマッチする表記方法」を参照されてください。

サンプル

JavaScript を使って簡単な正規表現のサンプルを作成してみます。

const regex = /201[6-9]年/;

regex.test('2014年');
--> false
regex.test('2016年');
--> true
regex.test('2018年');
--> true
regex.test('2020年');
--> false
regex.test('1996年');
--> false

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

もう一つ別のサンプルです。

const regex = /[1-3]年[A-E]組/;

regex.test('1年B組');
--> true
regex.test('3年E組');
--> true
regex.test('2年G組');
--> false
regex.test('4年B組');
--> false

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

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

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

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

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

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

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

[A0\-Z7]
[-500Point]
[Eom-]

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

[\^Mount]
[AEO^AMB]

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

[Code[089\]]
[]Tokyo]

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

[AA\\BB]

-- --

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

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。