文字クラス
=====

文字クラスは、文字や数字の区別など、文字の種類を区別します。

試してみましょう
--------

種類
--

| 文字 | 意味 |
| --- | --- |
| `[xyz][a-c]` | 文字クラス。囲んだ文字のいずれかに一致します。ハイフンを使用して文字の範囲を指定することもできますが、ハイフンが角括弧で囲まれた最初または最後の文字として現れた場合、それは通常の文字として文字クラスに含めるためのリテラルハイフンと見なされます。

 例えば、 `[abcd]` は `[a-d]` と同じです。
 "brisket" の "b" や "chop" の "c" に一致します。

例えば、 `[abcd-]` と `[-abcd]` は "brisket" の "b"、 "chop" の "c"、そして "non-profit" の "-" （ハイフン）に一致します。
例えば、 `[\w-]` は `[A-Za-z0-9_-]` と同じです。どちらも "brisket" の "b"、 "chop" の "c"、 "non-profit" の "n" に一致します。 |
| `[^xyz][^a-c]` | 否定または補完する文字クラス。つまり、括弧で囲まれていないもの全てに一致します。ハイフンを使用して文字の範囲を指定することができますが、ハイフンが `^` の後の最初の文字、または角括弧で囲まれた最後の文字として現れた場合、 それは通常の文字として文字クラスに含めるためにリテラルハイフンと解釈されます。例えば、`[^abc]` は `[^a-c]` と同じです。これらは、最初は "bacon" の "o" や "chop" の "h" に一致します。

**メモ:** ^ の文字は入力の先頭も意味することがあります。
 |
| `.` | 次のいずれかの意味を持ちます。* 改行文字 (`\n`、`\r`、`\u2028`、`\u2029`) を除くあらゆる 1 文字と一致します。例えば、`/.y/` は "my" と "ay" に一致し、"yes make my day" の "yes" には一致しません。
* 文字クラス内では `.` はその特別な意味を失い、文字通りの "." と一致します。

複数行フラグ (`m`) は "." の意味を変えないことに注意してください。そのため、複数行にわたるパターンに一致させるには、（IE の古いバージョン以外なら）文字集合 `[^]` を使うことで、改行を含む任意の文字に一致します。
`s` "dotAll" フラグは、ドットが改行文字に一致できるようにします。 |
| `\d` | あらゆる（アラビア）数字に一致します。`[0-9]` に相当します。例えば `/\d/` や `/[0-9]/` は "B2 is the suite number" の "2" に一致します。 |
| `\D` | あらゆる（アラビア）数字以外の文字に一致します。`[^0-9]` に相当します。例えば `/\D/` や `/[^0-9]/` は "B2 is the suite number" の "B" に一致します。 |
| `\w` | アンダースコアを含むあらゆる半角英数字（基本ラテンアルファベット）に一致します。 `[A-Za-z0-9_]` に相当します。例えば `/\w/` は、"apple" の "a"、"$5.28" の "5"、"3D" の "3" に一致します。 |
| `\W` | 基本ラテンアルファベットの文字以外に一致します。 `[^A-Za-z0-9_]` と同等です。例えば `/\W/` や `/[^A-Za-z0-9_]/` は、"50%" の "%" や "Émanuel" の "É" に一致します。 |
| `\s` | ホワイトスペース 1 文字に一致します。例えば空白、タブ、改ページ、改行、その他の Unicode 空白文字などです。 `[\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]` に相当します。例えば `/\s\w*/` は "foo bar" の " bar" に一致します。 |
| `\S` | ホワイトスペース以外の 1 文字に一致します。`[^
\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]` に相当します。例えば `/\S\w*/` は "foo bar" の "foo" に一致します。 |
| `\t` | 水平タブに一致します。 |
| `\r` | 復帰文字に一致します。 |
| `\n` | 行送り文字に一致します。 |
| `\v` | 垂直タブに一致します。 |
| `\f` | 改ページに一致します。 |
| `[\b]` | 後退文字に一致します。単語境界文字 (`\b`) を探す場合はアサーションを参照してください。 |
| `\0` | NUL 文字に一致します。この後ろに他の数字を続けてはいけません。 |
| `\c*X*` | 
キャレット記法を使用した制御文字に一致します。 "X" には A–Z の文字が入ります（コードポイント`U+0001`*–*`U+001A` に対応します）。例えば
 `/\cM\J/` は "\r\n" に一致します。
  |
| `\x*hh*` | `*hh*` （2 桁の 16 進数）コードからなる文字に一致します。 |
| `\u*hhhh*` | `*hhhh*` （4 桁の 16 進数）の値からなる UTF-16 コードユニットに一致します。 |
| `\u*{hhhh}*` または `*\u{hhhhh}*` | （`u` フラグがセットされた時のみ） `U+*hhhh*` または `U+*hhhhh*` (16 進数) Unicode 値からなる文字に一致します。 |
| `\p{*UnicodeProperty*}`,
 `\P{*UnicodeProperty*}` | Unicode 文字プロパティ に基づいて照合します（例えば、絵文字、日本語のカタカナ文字、日本語や中国語の漢字のみに一致するようにするなど）。 |
| `\` | 
 次の文字を特別に扱うこと、「エスケープ」することを示します。
 その振る舞いは、2 通りのうちのどちらか 1 つです。
 * 通常文字の前に付けられた場合、次の文字が特別なもので、文字通りには評価されないことを示します。例えば、 `/b/` は文字 `"b"` に一致します。しかし "b" の前にバックスラッシュを置いて `\b` とすると、単語区切りを意味するようになります。
* 特殊文字の前に付けられた場合、次の文字が特別なものでなく、文字通りに評価されることを表します。例えば、 "\*" は、直前の文字が 0 個以上の出現した場合に一致することを意味する特殊文字です。例えば、 `/a*/` は 0 個以上の "a" と一致します。 `*` と文字通りに照合するには、その直前にバックスラッシュを入れます。例えば、`/a\*/` は "a\*" と一致します。

この文字を文字通りに一致させるには、それ自身をエスケープします。つまり、 `\` を検索するには `/\\/` を使ってください。
 |
| `*x*|*y*` | **論理和:** "x" または "y" に一致します。パイプ (`|`) で区切られた各成分は、代替 (*alternative*)と呼ばれます。例えば、`/green|red/` は "green apple" の "green" と "red apple" の "red" に一致します。````**メモ:** 論理和は「選択肢の集合」を指定するもう一つの方法ですが、文字クラスではありません。論理和は独立したものではありません。大きなパターンの一部にするためにはグループを使用する必要があります。`[abc]` は機能的には `(?:a|b|c)` と等価です。`` |

例
-

### 一連の数字を探す


```js
const randomData = "015 354 8787 687351 3512 8735";
const regexpFourDigits = /\b\d{4}\b/g;
// \b は境界を示します（つまり、単語の途中から照合開始しません）
// \d{4} は 4 つの数字を示します
// \b は別の境界を示します（つまり、単語の真ん中でマッチが終わりません）

console.table(randomData.match(regexpFourDigits));
// ['8787', '3512', '8735']
```

### A から始まる（ラテンアルファベットの）単語を探す


```js
const aliceExcerpt =
  "I'm sure I'm not Ada,' she said, 'for her hair goes in such long ringlets, and mine doesn't go in ringlets at all.";
const regexpWordStartingWithA = /\b[aA]\w+/g;
// \b は境界を示します（つまり、単語の途中から照合を開始しません）
// [aA] は a または A の文字を示します
// \w+ は複数回の \*ラテンアルファベットからなる\* 任意の文字を示します

console.table(aliceExcerpt.match(regexpWordStartingWithA));
// ['Ada', 'and', 'at', 'all']
```

### （Unicode 文字の）単語を探す

単語を表すために、ラテンアルファベットではなく、 Unicode 文字の範囲を使用することができます。（つまり、ロシア語やアラビア語のような他の言語のテキストを扱うことができます。） Unicode の 「基本多言語面」には、世界中で使われているほとんどの文字が含まれており、それらの文字で書かれた単語にマッチするための文字クラスと範囲を利用できます。


```js
const nonEnglishText = "Приключения Алисы в Стране чудес";
const regexpBMPWord = /([\u0000-\u0019\u0021-\uFFFF])+/gu;
// U+0000 から U+FFFF までの BMP、ただし、U+0020 は空白

console.table(nonEnglishText.match(regexpBMPWord));
["Приключения", "Алисы", "в", "Стране", "чудес"];
```

### 母音を数える


```js
const aliceExcerpt =
  "There was a long silence after this, and Alice could only hear whispers now and then.";
const regexpVowels = /[AEIOUYaeiouy]/g;

console.log("Number of vowels:", aliceExcerpt.match(regexpVowels).length);
// Number of vowels: 26
```

関連情報
----

* 正規表現ガイド
    + アサーション
    + 数量詞
    + Unicode プロパティエスケープ
    + グループと後方参照
* `RegExp()` コンストラクター
* ECMAScript 仕様書での文字クラス（英語）