正規表現

正規表現の文字クラスは[ ]角括弧 – 否定や範囲,AND,エスケープ

正規表現での文字クラスは角括弧

正規表現の文字クラスとは

正規表現の文字クラスとは、角括弧「[ ]」で囲まれ、1つ以上の文字を列挙したものです。文字クラスは、その中のどれか1文字にマッチします。

下の例では「[ekmnop]」で「ekmnopのいずれか一文字」を表し、その後に「直前の文字を1回以上繰り返す」意味の「+」を記載することで、「ekmnopのいずれか一文字以上」で構成された一文を示しています。

// 正規表現でekmnopの小文字で一行が構成されている文字列
^[ekmnop]+$

// 検索対象
pokemon
Pokemon
Pokémon

// 検索結果
pokemon

文字クラスを繰り返すときの書き方

文字クラスを複数回繰り返して文字列としたい場合には次のような表現を使えます。それぞれ記事リンクとなっているので、詳しくは各記事でチェックできます。

文字クラスのハイフン”-“は「〜」の意味

文字クラス前の「-(ハイフン)」は前後の文字とあわせて「◯◯からXXまでの文字」を表します。たとえば「[a-z]」となっていれば「aからzまでのアルファベット小文字」、「[0-9]」であれば「0123456789の1桁の数値」をさします。

// 正規表現でアルファベットの小文字で一行が構成されている文字列
^[a-z]+$

// 検索対象
pokemon
Pokemon
Pokémon

// 検索結果
pokemon
シャワーズ

ここでいう「◯からXまでの文字」は文字コード上の並びを基準に判断しています。そのためカタカナ全部を表すときは「ア-ン」ではなく「[ァ-ヴー]」とする必要があるなど、ひらがなとカタカナ、漢字は気をつけて範囲指定しましょう!

文字クラスのキャレット”^”は、否定の意味

文字クラス内にて「[^abc]」のようにキャレットを使うと「abc以外の一文字」という否定の意味を持ちます。特定の文字以外を許可する場合に用いましょう。

// 正規表現でアルファベットの小文字以外で一行が構成されている文字列
^[^a-z]+$

// 検索対象
pokemon
Pokemon
Pokémon
POKEMON

// 検索結果
POKEMON

文字クラス内のピリオド”.”は、単なる記号

文字クラス内の「.(ピリオド)」は単なる記号として扱われます。文字クラスの外では任意の一文字を表すメタ文字として使用されますが、文字クラス内ではピリオドの記号そのものとして処理されます。

文字クラス内では []\-^ をエスケープすべき

文字クラスにてエスケープが必要な記号は次のとおりです。文字クラス内は通常よりメタ文字が制限されているのでエスケープの対象もやや異なります。

  • -ハイフン
  • [ 角括弧はじめ
  • ] 角括弧おわり
  • ^ キャレット,ハット
  • \ バックスラッシュ
  • / スラッシュ(言語による)

文字コード内のAND表現は、”&&”にて可能

文字コード内でAND表現をするには「&&」でつなぎます。前提として文字クラスは「[123[456]]」のように文字クラスのなかに文字クラスを入れられるのですが、これを「[123&&[456]]」とすると123かつ456という意味になります。

これだけでは意味ないのですが「[^ ]」による否定と組み合わせることで、〇〇だけどXXでないという表現ができます。

// 正規表現で1以外の半角数字のみで構成された文字列
^[0-9&&[^1]]+$

// 検索対象
001
002
003
150
151

// 検索結果
002
003

上の例では1以外の数字を表現するために「[0-9&&[^1]]」と記載しています。これを分解すると前半部分の「0-9」と後半部分の「[^1]」とこれらをつなぐ「&&」の3つとなります。

  • 「0-9」は0123456789のいずれかの数値
  • 「[^1]」は1以外の文字(この時点では数字以外も含む)
  • 「&&」はAND

「0-9」は0から9の1桁の数値、「[^1]」は1以外の文字を表すため、これらをANDとしてつなぐと0から9のうち1以外の1桁の数値という条件ができます。