"+7(903)-123-45-67"
のような電話番号があり、それを純粋な数字 79031234567
に変換する必要があるという、実用的なタスクを考えてみましょう。
そのためには、数字ではないものをすべて見つけて削除します。文字クラスは、その際に役立ちます。
文字クラスとは、特定のセットの任意の記号に一致する特殊な表記法です。
まず、「数字」クラスを見てみましょう。これは \d
と記述され、「任意の1桁の数字」に対応します。
たとえば、電話番号の最初の数字を見つけましょう
let str = "+7(903)-123-45-67";
let regexp = /\d/;
alert( str.match(regexp) ); // 7
フラグ g
がない場合、正規表現は最初の一致、つまり最初の数字 \d
のみを検索します。
すべての数字を見つけるために g
フラグを追加しましょう
let str = "+7(903)-123-45-67";
let regexp = /\d/g;
alert( str.match(regexp) ); // array of matches: 7,9,0,3,1,2,3,4,5,6,7
// let's make the digits-only phone number of them:
alert( str.match(regexp).join('') ); // 79031234567
これは数字の文字クラスでした。他にも文字クラスがあります。
最もよく使用されるのは
\d
(「d」は「digit」の略)- 数字:
0
から9
までの文字。 \s
(「s」は「space」の略)- スペース記号:スペース、タブ
\t
、改行\n
、および\v
、\f
、\r
などのその他のまれな文字が含まれます。 \w
(「w」は「word」の略)- 「単語」文字:ラテンアルファベットの文字、数字、またはアンダースコア
_
です。ラテン文字以外(キリル文字やヒンディー語など)は\w
に属しません。
たとえば、\d\s\w
は、「数字」の後に「スペース文字」、その後に「単語文字」が続くことを意味します(例:1 a
)。
正規表現には、通常の記号と文字クラスの両方を含めることができます。
たとえば、CSS\d
は、その後に数字が続く文字列 CSS
に一致します
let str = "Is there CSS4?";
let regexp = /CSS\d/
alert( str.match(regexp) ); // CSS4
また、多くの文字クラスを使用できます
alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'
一致(各正規表現文字クラスに対応する結果文字があります)
逆クラス
すべての文字クラスには、同じ文字で大文字で表される「逆クラス」が存在します。
「逆」とは、他のすべての文字に一致することを意味します。たとえば、
\D
- 数字以外:
\d
以外の文字(例:文字)。 \S
- スペース以外:
\s
以外の文字(例:文字)。 \W
- 単語以外の文字:
\w
以外のもの(例:ラテン文字以外またはスペース)。
本章の冒頭で、"+7(903)-123-45-67"
のような文字列から数字のみの電話番号を作成する方法を見ました。すべての数字を見つけて結合します。
let str = "+7(903)-123-45-67";
alert( str.match(/\d/g).join('') ); // 79031234567
別の、より短い方法は、数字以外の \D
を見つけて文字列から削除することです
let str = "+7(903)-123-45-67";
alert( str.replace(/\D/g, "") ); // 79031234567
ドットは「任意の文字」
ドット .
は、「改行以外の任意の文字」に一致する特別な文字クラスです。
たとえば
alert( "Z".match(/./) ); // Z
または正規表現の途中で
let regexp = /CS.4/;
alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (space is also a character)
ドットは「任意の文字」を意味しますが、「文字がないこと」は意味しないことに注意してください。一致する文字が必要です
alert( "CS4".match(/CS.4/) ); // null, no match because there's no character for the dot
「s」フラグを使用した文字通りの任意の文字としてのドット
デフォルトでは、ドットは改行文字 \n
に一致しません。
たとえば、正規表現 A.B
は A
に一致し、次に改行 \n
以外の任意の文字が間に挟まれた B
に一致します
alert( "A\nB".match(/A.B/) ); // null (no match)
ドットが文字通り「任意の文字」(改行を含む)を意味するようにしたい場合があります。
それがフラグ s
の役割です。正規表現にフラグ s
がある場合、ドット .
は文字通り任意の文字に一致します
alert( "A\nB".match(/A.B/s) ); // A\nB (match!)
s
フラグはIEではサポートされていません。
幸いなことに、どこでも機能する代替手段があります。「任意の文字」に一致させるために、[\s\S]
のような正規表現を使用できます(このパターンは、記事セットと範囲 [...]で説明します)。
alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (match!)
パターン [\s\S]
は、文字通り「スペース文字またはスペース文字以外」を意味します。言い換えれば、「何でも」です。 [\d\D]
など、別の補完クラスのペアを使用することもできます。これは問題ありません。または、[^]
でもかまいません。これは、何もない場合を除くすべての文字に一致することを意味するためです。
また、同じパターンで両方の種類の「ドット」が必要な場合にも、このトリックを使用できます。実際のドット .
は通常の方法(「改行を含まない」)で動作し、「任意の文字」に一致させる方法として [\s\S]
などを使用します。
通常、スペースにはあまり注意を払いません。私たちにとって、文字列 1-5
と 1 - 5
はほぼ同じです。
しかし、正規表現がスペースを考慮していない場合、正しく機能しない可能性があります。
ハイフンで区切られた数字を見つけようとしてみましょう
alert( "1 - 5".match(/\d-\d/) ); // null, no match!
正規表現 \d - \d
にスペースを追加して修正しましょう
alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, now it works
// or we can use \s class:
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, also works
スペースは文字です。他の文字と同じくらい重要です。
正規表現にスペースを追加または削除して、同じように機能することを期待することはできません。
言い換えれば、正規表現ではすべての文字が重要であり、スペースも同様です。
まとめ
以下の文字クラスが存在します
\d
– 数字。\D
– 数字以外。\s
– スペース記号、タブ、改行。\S
–\s
以外すべて。\w
– ラテン文字、数字、アンダースコア'_'
。\W
–\w
以外すべて。.
– 正規表現に's'
フラグがある場合は任意の文字、それ以外の場合は改行\n
以外の任意の文字。
…しかし、これだけではありません!
JavaScriptで文字列に使用されるUnicodeエンコーディングは、文字に多くのプロパティを提供します。たとえば、文字が属する言語(文字の場合)、句読点であるかどうかなどです。
これらのプロパティで検索することもできます。そのためには、次の記事で説明するフラグ u
が必要です。
コメント
<code>
タグを使用します。複数行の場合は、<pre>
タグで囲みます。10行を超える場合は、サンドボックス(plnkr、jsbin、codepen…)を使用します。