文字クラスを使って色々な文字にマッチするパターンを記述する

JavaScript で使用できる正規表現のメタ文字のひとつである文字クラスの使い方について解説します。文字クラスでは固定の文字列の他に、任意の一文字にマッチするパターンや、複数の候補のいずれか一つの文字にマッチするパターンを記述することができます。

(Last modified: )

記述した文字にマッチする

パターンの中に文字を記述した場合は、その文字そのものとマッチします。例えば次のようなパターンは A で始まり、次に B が続き、最後に C が続く文字列にマッチします。

const regexp = /ABD/;

ABC や OABC 、 ABCE などにマッチします。 AIBD や AB にはマッチしません。

ABCABCDEF
〇 PABC
✕ AIBD
✕ AB
サンプルコード

簡単なサンプルで試してみます。

let regexp = /Sun/;

console.log(regexp.test('Today is Sunday'));
>> true
console.log(regexp.test('The Sun rose'));
>> true
console.log(regexp.test('Ham Sandwich'));
>> false

任意の一文字(.)

メタ文字のひとつであるドット(.)は任意の一文字(例外あり)にマッチします。

.

※ ただし、次の文字にはマッチしません。

\n
\r
\u2028   # Line Separator
\u2029   # Paragraph Separator

例えば次のようなパターンは A で始まり、任意の一文字が続き、そのあとに B が続く文字列にマッチします。

const regexp = /A.B/;

AOB や AED にはマッチします。 ATYB や AB にはマッチしません。

AOBA#B
〇 WWAmBEE
✕ ADDB 
✕ AB

次のようなパターンは A で始まり、任意の二文字が続き、そのあとに B が続く文字列にマッチします。

const regexp = /A..B/;
ATTB
〇 OAmnBW
✕ AVB 
✕ APPPB

次のようなパターンは単語の境界を表すメタ文字である \b と組み合わせたもので、任意の文字の三文字からなる単語にマッチします。

const regexp = /\b...\b/;
〇 Blue Red Yellow
サンプルコード

簡単なサンプルで試してみます。

let regexp = /S..d/;

console.log(regexp.test('Today is Sunday'));
>> true
console.log(regexp.test('The Sun rose'));
>> false
console.log(regexp.test('Ham Sandwich'));
>> true

角括弧の中の一文字([...])

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

[...]

例えば次のようなパターンは A で始まり、 [ から ] の間に記述された D 、 E 、 F のいずれかの一文字が続き、そのあとに B が続く文字列にマッチします。

const regexp = /A[DEF]B/;

ADB や AEB にはマッチします。 AOB や AdB にはマッチしません。

ADBAEB
〇 wAFBw
✕ AOB 
✕ AdB
サンプルコード

簡単なサンプルで試してみます。

let regexp = /[sS]un/;

console.log(regexp.test('Today is Sunday'));
>> true
console.log(regexp.test('The Sun rose'));
>> true
console.log(regexp.test('Ham Sandwich'));
>> false

角括弧の否定

角括弧([...])の先頭に否定を表すキャレット(^)を記述した場合、角括弧の中に記述した複数の文字のいずれにも一致しない場合にマッチします。

[^...]

例えば次のようなパターンは A で始まり、 [ から ] の間に記述された D 、 E 、 F のいずれにも一致しない一文字が続き、そのあとに B が続く文字列にマッチします。

const regexp = /A[^DEF]B/;

ご注意いただきたいのは ^ のすぐあとの文字だけを否定するのではなく、 [ から ] に記述されたすべての文字を否定します。

AOB や AdB にはマッチします。 ADB や AEB にはマッチしません。

AOBAdB
〇 wA8Bw
✕ ADB 
✕ AEB
サンプルコード

簡単なサンプルで試してみます。

let regexp = /199[^01234]/;

console.log(regexp.test('My birthday is 1998/03/12'));
>> true
console.log(regexp.test('Graduated in 1994'));
>> false
console.log(regexp.test('It opened in 1996'));
>> true

角括弧の範囲指定

角括弧([...])の中でハイフン(-)を記述すると、ハイフンの左側から右側までの範囲に含まれる連続するいずれかの文字にマッチします。例えば次のように記述することができます。

[0-9]  0 から 9 までのいずれかの数値
[a-z]  a から z までのいずれかの文字
[A-Z]  A から Z までのいずれかの文字

例えば次の二つのパターンは同じ文字にマッチします。

const regexp1 = /[3-8]/;
const regexp2 = /[345678]/;

[ から ] の中に複数の範囲を記述したり、通常の文字の指定と組み合わせることもできます。次のパターンは a から e 、 g 、 m 、 x から z までのいずれかの文字にマッチします。

const regexp1 = /[a-egmx-z]/;
const regexp2 = /[abcdegmxyz]/;

英数字のいずれかの文字にマッチするパターンとして次のような記述がよく使われます。

const regexp = /[0-9a-zA-Z]/;

このように連続する文字の中のいずれかひとつにマッチさせたい場合にこの書式は便利です。

サンプルコード

簡単なサンプルで試してみます。

let regexp = /199[0-6]/;

console.log(regexp.test('My birthday is 1998/03/12'));
>> false
console.log(regexp.test('Graduated in 1994'));
>> true
console.log(regexp.test('It opened in 1996'));
>> true

文字クラスの略記法

文字クラスでは [ から ] の中に文字の範囲を記述することで多くの文字の中のいずれかの文字とマッチするパターンを記述することができますが、特によく使用するものについては略記法が用意されています。 JavaScript で利用可能な略記法は次の通りです。

\d  数字 [0-9]
\D  数字以外 [^\d]
\w  英数字とアンダーバー [0-9a-zA-Z_]
\W  英数字とアンダーバー以外 [^\w]
\s  空白文字 [ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\S  空白文字以外 [^\s]

\D は \d の否定のように大文字のものは小文字のものの否定になっています。

空白文字は半角スペース以外に改行(\n)やタブ(\t)など空白に相当する文字にマッチします。

例えば次の二つのパターンは同じ文字にマッチします。

const regexp1 = /[0-9]/;
const regexp2 = /\d/;

記述方法が異なるだけでマッチする文字は同じです。略記法が用意されているものについては略記法を使用することでよりコンパクトにパターンを記述することができます。

サンプルコード

簡単なサンプルで試してみます。

let str = '郵便番号は 456-7890 です';
let regexp = /\d{3}-\d{4}/;

let result = str.match(regexp);
console.log(result[0]);
>> 456-7890

改行などの特殊な文字

改行やタブなどキーボードから入力できないような特殊な文字にマッチするパターンを記述するため、バックスラッシュ(\)と文字を組み合わせたメタ文字が用意されています。

\0        NULL
\f        改ページ
\n        改行
\r        復帰
\t        タブ
\v        垂直タブ
\cX       Ctrl + x
\xhh      16進数 hh のASCII文字
\uhhhh    16進数 hhhh で表されるUTF-16のコードユニット

また u フラグが設定されている場合は、次のメタ文字も使用できます。

\u{hhhh}
\u{hhhhh}  16進数 hhhh または hhhhh で表されるUnicodeコードポイント
サンプルコード

簡単なサンプルで試してみます。

let str = `こんにちは。
今日も寒いですね。`;
let regexp = /。\n./;

let result = str.match(regexp);
console.log(result[0]);
>>  。
>>  今

-- --

JavaScript で使用できる正規表現のメタ文字のひとつである文字クラスの使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。