前回の記事では正規表現の概要や代表的なパターンについて取り上げましたが、ここからはより実践的な利用を目的に考えていきましょう。

正規表現の文字クラスは、数字やアルファベットなど文字の種類を区別します。
例えば、固定の文字列や、また文字列の中から任意の一文字にマッチするかなどを検証できます。

今回は、文字クラスについて解説していきます。

数字\d(digit)

\dは、あらゆる数字の文字にマッチします。

以下は、文字列の中から最初の数字を探します。

let reg = /\d/;
let str = 'Hello123';

console.log(str.match(reg)); // ["1"]

例えば、123-4567という郵便番号があり、そのすべての数字を見つけたい場合、gフラグを一番後ろに記述します。

let reg = /\d/g;
let tel = '123-4567';

console.log(tel.match(reg)); // ["1", "2", "3", "4", "5", "6", "7"]

さらに、joinメソッドで各数字を集結させることもできます。

let reg = /\d/g;
let tel = '123-4567';

console.log(tel.match(reg).join('')); // "1234567"

半角英数字\w(word)

\wは、半角英数字にマッチします。ラテンのアルファベットや数字の文字、またアンダースコアを含みます。

例えば、/\w/は、'JavaScript!'"J"や、'$50'"5"にマッチします。
以下は、一致するすべての文字を取得したコードです。

let reg = /\w/g;

let str1 = 'JavaScript!';
let str2 = '$50';

console.log(str1.match(reg)); // ["J", "a", "v", "a", "S", "c", "r", "i", "p", "t"]
console.log(str2.match(reg)); // ["5", "0"]

'JavaScript!''!'と、'$50'"$"以外取得できたことが分かります。

スペース\s(space)

\sは、スペースにマッチします。スペース、タブ\t、改行\n、改ページ\fを含みます。

以下は、文字列の中から最初のスペースを探します。

let reg = /\s/;
let str = 'A B C';

console.log(str.match(reg)); // [" "]

例えば、\w\s\dは、半角英数字 → スペース → 数字と続く文字列を意味します。
以下は文字列をすべて文字クラスを使って表現した例です。

let reg = /\w\s\w\w\w\w\s\w\w\w\d/;
let str = 'I love CSS3';

console.log(str.match(reg)); // ["I love CSS3"]

各文字クラスが個々の文字に対応し、最終的に文字列を取得できることが確認できます。

逆クラス

\d, \w, \sの文字クラスには、逆の意味を持つクラスが存在します。これらを大文字で表すことで逆クラスとして作用します。

  • \D:数字以外の文字にマッチ
  • \W:半角英数字以外の文字にマッチ
  • \S:スペース以外の文字にマッチ
let reg1 = /\D/;
let str1 = 'Hello123';

let reg2 = /\W/;
let str2 = 'JavaScript!';

let reg3 = /\S/;
let str3 = 'A B C';

console.log(str1.match(reg1)); // ["H"]
console.log(str2.match(reg2)); // ["!"]
console.log(str3.match(reg3)); // ["A"]

数字クラスで取り上げた電話番号を取得する場合、次のように記述することもできます。

let reg = /\D/g;
let tel = '123-4567';

console.log(tel.replace(reg, '')); // "1234567"

文字列の中から数字ではない文字を検索し、それを空文字に置き換えることで対応します。

記述したの文字パターン

記述した文字にマッチするか検索するには、単純に/任意の文字/を記述します。

let reg = /CDE/;

let str1 = 'CDE';
let str2 = 'ABCDE';
let str3 = 'CDEFG';
let str4 = 'CD';
let str5 = 'CDYZ';

console.log(reg.test(str1)); // true
console.log(reg.test(str2)); // true
console.log(reg.test(str3)); // true
console.log(reg.test(str4)); // false
console.log(reg.test(str5)); // false

CDEの全ての文字が同じ順番で含まれているパターンには、trueが返ります。

任意の一文字

ドット.は、あらゆる一文字とマッチします。

let reg = /./;
let str = 'XYZ';

console.log(str.match(reg)); // ["X"]

多くの場合は他の正規表現の中で使われ、任意の一文字を表します。

次の文字列パターンはすべてマッチします。

let reg = /Java.cript/;

let str1 = 'JavaScript';
let str2 = 'Java-cript';
let str3 = 'Java cript';

console.log(str1.match(reg)); // ["JavaScript"]
console.log(str2.match(reg)); // ["Java-cript"]
console.log(str3.match(reg)); // ["Java cript"]

.の箇所が半角英数字やハイフン、スペースいずれの場合もマッチしていますが、文字の欠如ではないため何かしらの文字が必要です。

例外として、ドット.は以下の文字にはマッチしません。

  • \n
  • \r
  • \u2028
  • \u2029

例えば、改行文字\nを含めた文字列にはマッチしません。

let reg = /Java.cript/;
let str = 'Java\ncript';

console.log(str.match(reg)); // null

しかし、フラグsを使用することで、.を改行文字\nにも一致させることができます。

let reg = /Java.cript/s;
let str = 'Java\ncript';

console.log(str.match(reg)); 
/* 
  ["Java
  cript"]
*/

エスケープ

特殊文字を文字通りのまま評価させたい場合、その文字をエスケープ\する必要があります。

+*は特殊文字で、文字の出現回数を指定する際に使用されます。
例えばa+は、1回以上の"a"とマッチするという意味になります。

これを文字通りの"a+"とマッチさせたい場合、特殊文字の直前にバックスラッシュを記述してエスケープさせます。

// 1回以上の"a"
let reg1 = /a+/;

// 文字通りの"a+"
let reg2 = /a\+/;

まとめ

今回は、文字クラスについて解説しました。

// ポイント
* 文字クラスは、数字やアルファベットなど文字の種類を区別する
* \d:数字
* \w:半角英数字
* \s:スペース
* \D, \W \Sは、上記の逆クラス
* /文字/:任意の文字パターン
* /./:あらゆる一文字
* エスケープ\:特殊文字を文字通りに評価する

合わせて読みたい正規表現シリーズ

第1回:正規表現の概要
第2回:文字クラス(当記事)
第3回:文字集合と範囲
第4回:文字列の先頭と末尾
第5回:量指定子