このコンテンツはまだ翻訳されていません。 翻訳に協力してください

セットと範囲 [...]

角括弧 […] 内の複数の文字または文字クラスは “指定された中の任意の文字を探す” ことを意味します。

セット

例えば、[eao] は3文字 'a', 'e', または 'o' のいずれかを意味します。

それは セット と呼ばれます。セットは通常の文字と併せて正規表現の中で使うことができます。:

// [t or m], 次に "op" となる文字列を見つける
alert( "Mop top".match(/[tm]op/gi) ); // "Mop", "top"

セットには複数の文字がありますが、マッチした中での1文字に相当することに注意してください。

従って、下の例ではマッチするものはありません:

// "V" に続き [o or i], その後 "la" となる文字列を見つける
alert( "Voila".match(/V[oi]la/) ); // null, マッチしない

パターンは次のように想定します:

  • V,
  • 次に文字 [oi]1つ,
  • 次に la.

なので、Vola もしくは Vila がマッチします。

範囲

角括弧は 文字の範囲 を含むこともあります。

例えば、[a-z]a から z までの範囲の文字で、 [0-5]0 から 5 までの数字です。

下の例では、x に続いて2桁の数字または A から F までの文字を探しています:

alert( "Exception 0xAF".match(/x[0-9A-F][0-9A-F]/g) ); // xAF

単語 Exception で、部分文字列 xce があることに注目していください。それはパターンにマッチしませんでした。理由はパターン [0-9A-F] が大文字であるのに対し、小文字だからです。

それも見つけたい場合は、a-f の範囲も追加します: [0-9A-Fa-f]i フラグも小文字を許容するでしょう。

文字クラスは、特定の文字セットの短縮形です

例:

  • \d[0-9] と同じです,
  • \w[a-zA-Z0-9_] と同じです,
  • \s[\t\n\v\f\r ] に他のユニコードの空白文字を加えたものと同じです。

[…] の内側でも同様に文字クラスを使うことができます。

例えば、“twenty-third” のような言葉に対し、すべての単語文字またはダッシュにマッチさせたいとします。\w はダッシュを含まないため、\w+ ではできません。しかし [\w-] とすることができます。

pattern:[\s\S] のように、可能性のあるすべての文字をカバーするためにクラスの組み合わせを使うこともできます。これは空白及び非空白 – なので任意の文字に一致します。 ドット "." は改行以外の任意の文字にマッチするので、これはドットよりも広いです。

範囲を除外する

通常の範囲に加えて、 [^…] のような、範囲を “除外” するものもあります。

それらは開始時にキャレット文字 ^ で指定され、指定されたもの以外の文字 と一致します。

例:

  • [^aeyo]'a', 'e', 'y' または 'o' を除く任意の文字.
  • [^0-9] – 数字以外の任意の文字, \D と同じです.
  • [^\s] – 任意の非空白文字, \S と同じです.

下の例では、文字、数字または空白以外の文字を探します:

alert( "alice15@gmail.com".match(/[^\d\sA-Z]/gi) ); // @ and .

[…] でエスケープしない

通常、正確にドット文字を見つけたい場合、\. のようにエスケープが必要です。そしてバックスラッシュが必要な場合には、\\ を使います。

角括弧で囲まれた大多数の特殊文字は、エスケープなしで使うことができます:

  • ドット '.'.
  • プラス '+'.
  • 丸括弧 '( )'.
  • ダッシュ '-', 先頭または末尾に(範囲を定義していない場合).
  • キャレット '^', 先頭でない場合(それは除外を意味する).
  • そして、角括弧の開始 '['.

つまり、角括弧を意味するものを除いて、すべての特殊文字が許可されます。

角括弧内のドット "." は単なるドットを意味します。パターン [.,] は1つの文字を探します: ドットまたはカンマです。

下の例では、正規表現 [-().^+]-().^+ の文字の1つを探します:

// エスケープは必要ありません
let reg = /[-().^+]/g;

alert( "1 + 2 - 3".match(reg) ); // +, - にマッチ

…しかし “念の為” エスケープすることを決めた場合にも特に害はありません:

// すべてエスケープ
let reg = /[\-\(\)\.\^\+]/g;

alert( "1 + 2 - 3".match(reg) ); // 同じく動作します: +, -

タスク

正規表現 /Java[^script]/ があります。

文字列 Java はマッチするでしょうか? JavaScript だとどうでしょう?

解答: いいえ, はい.

  • Java では何もマッチしません。なぜなら [^script] は “指定されたもの以外の任意の文字” を意味するからです。そのため、正規表現は "Java" に続くそのような文字を探しますが、文字列は終わりなので該当するものはありません。

    alert( "Java".match(/Java[^script]/) ); // null
  • マッチします。正規表現は大文字小文字を区別するため、[^script] は文字 "S" にマッチします。

    alert( "JavaScript".match(/Java[^script]/) ); // "JavaS"

時間は hours:minutes もしくは hours-minutes というフォーマットで表せます。いずれの時も分も2桁です: 09:0021-30.

時間を見つける正規表現を書いてください:

let reg = /your regexp/g;
alert( "Breakfast at 09:00. Dinner at 21-30".match(reg) ); // 09:00, 21-30

P.S. このタスクでは、時間は常に正しいと想定するので、“45:67” のような正しくない文字列をフィルタする必要はありません。あとでそれらも扱っていきます。

解答: \d\d[-:]\d\d.

let reg = /\d\d[-:]\d\d/g;
alert( "Breakfast at 09:00. Dinner at 21-30".match(reg) ); // 09:00, 21-30

ダッシュ '-' は角括弧の中で特別な意味を持っていますが、先頭や末尾のときではなく、他の文字の間にある場合のみなので、エスケープする必要はないことに注意してください。

チュートリアルマップ

コメント

コメントをする前に読んでください…
  • 自由に記事への追加や質問を投稿をしたり、それらに回答してください。
  • 数語のコードを挿入するには、<code> タグを使ってください。複数行の場合は <pre> を、10行を超える場合にはサンドボックスを使ってください(plnkr, JSBin, codepen…)。
  • 記事の中で理解できないことがあれば、詳しく説明してください。