Download PDF

正規表現は、あるテキストから特定のパターンを見つけるために使用される文字または記号のグループであり、もしあなたがそれをステロイド上のワイルドカードと呼ぶことができます。 開発者として、正規表現をマスターすることは、ツールベルトの中に入れておくと強力なツールとなります。IDE で正規表現を使用した検索と置換は時々本当に便利で、私も毎日コマンド ラインで使用しています。 この投稿では、正規表現について知っておくべきことをすべて説明します。

正規表現とは、対象の文字列に対して左から右へマッチさせるパターンです。 正規表現」という言葉は口が悪いので、通常は「regex」または「regexp」と省略されているのを見かけます。 正規表現は、文字列内のテキストを置換したり、フォームを検証したり、パターン一致に基づいて文字列から部分文字列を抽出したり、その他多くのことに使用されます。

アプリケーションを書いていて、ユーザーがユーザー名を選択する際の規則を設定したいとします。 ユーザー名に文字、数字、アンダースコア、およびハイフンを含めることを許可したいと思います。 また、ユーザ名の文字数を制限して、見苦しくないようにしたいと思います。 ユーザー名を検証するために次の正規表現を使用します:

正規表現

上記の正規表現は、john_doe, jo-hn_doe および john12_as の文字列を受け入れ可能です。 Jo は大文字が含まれており、また短すぎるためマッチしません。

目次

  • 基本マッチャー
  • メタ文字
  • フルストップ
  • 文字セット
  • 否定文字セット
  • 反復
  • The スター
  • プラス
  • クエスチョンマーク
  • ブレイス
  • 文字グループ
  • オルタネーション
  • 脱出特殊文字
  • アンカー
  • キャリア
  • Caretドル
  • 速記文字セット
  • ルックアラウンド
  • 正ルックヘッド
  • 負ルックヘッド
  • 正ルックビハインド
  • フラグ
  • Case Insensitive
  • グローバル検索

  • マルチライン
  • グリードとレイジーマッチング

基本的なマッチャー

正規表現は、テキストで
検索を行うために使用する文字のパターンでしかありません。 たとえば、正規表現 the は、
t という文字の後に h という文字が続き、さらに e という文字が続く、という意味です。

the => The fat cat sat on the mat.

正規表現のテスト

正規表現 123123 という文字列にマッチします。 正規表現は,regular
expression の各文字を入力文字列の各文字と次々に比較することによって,入力文字列とマッチングされる。 正規
式は通常大文字と小文字を区別するので、正規表現 The は文字列 the と一致しない。

The => The fat cat sat on the mat.

正規表現をテストする

メタ文字

メタ文字は正規表現の構成単位である。 メタ
キャラクタはそれ自体で成り立っているのではなく、何らかの
特別な方法で解釈される。 メタ文字の中には特別な意味を持つものがあり、角括弧の中に書かれている。 メタ文字は次の通りである:

2.1 Full stop

Full stop .がメタ文字の最も簡単な例である。 メタ文字.
は任意の1文字にマッチする。 例えば、正規表現.arは「任意の文字、その後に文字a、その後に文字rが続く」という意味です。

.ar => The car parked in the garage.

正規表現のテスト

2.2 文字セット

文字セットは文字クラスとも呼ばれます。
文字セットを指定するには角括弧を使用します。 文字セットの中にハイフンを入れて、文字の範囲を指定します。 角括弧
内の文字範囲の順序は関係ない。 例えば、正規表現heは、大文字のTまたは小文字のt、文字のh、文字のeを意味する。

he => The car parked in the garage.

正規表現を試す

ただし、文字セットの中のピリオは文字通りのピリオドの意味である。 正規表現arは、小文字aの後に文字r
の後にピリオド.が続くという意味である。2.1 文字セットの否定

一般に、キャレット記号は文字列の開始を表しますが、開始角括弧の後に
入力すると、文字セットが否定されます。
例として、正規表現arの意味は、c以外の任意の文字、
その後にaが続き、さらにrという文字が続くということです。

ar => The car parked in the garage.

正規表現のテスト

2.3 繰り返し

次のメタ文字 +* または ? は、サブパターンが何回出現するかを指定するために使用されます。 これらのメタ文字は、
状況によって異なる動作をします。

2.3.1 星

シンボル * は、直前のマッチャーのゼロ回以上の繰り返しにマッチします。 正規表現 a* は、先行する小文字 a のゼロ回以上の繰り返しにマッチします。 しかし、もしそれが文字セットやクラスの後に現れた場合、その文字セット全体の繰り返しを見つけます。 例えば、正規表現 * は、「小文字の連続した任意の数」を意味します。

* => The car parked in the garage #21.

正規表現のテスト

* 記号は、メタ文字 .とともに使用すると
文字 .* の任意の文字列にマッチします。 * 記号は空白文字 \s
と一緒に使うことで、空白文字の文字列にマッチさせることができます。 例えば、
\s*cat\s*という表現は、0個以上のスペース、小文字c
小文字a、小文字t、0個以上のスペースが続くことを意味する。

\s*cat\s* => The fat cat sat on the concatenation.

正規表現のテスト

2.3.2 プラス

記号+は前の文字の一つ以上の繰り返しに合致させる。 例えば,正規表現c.+tは,小文字cの後に少なくとも1つの文字が続き,さらに小文字tが続くことを意味する。 t が文中の最後の t であることを明確にする必要があります。

c.+t => The fat cat sat on the mat.

正規表現のテスト

2.3.3 クエスチョンマーク

正規表現において、メタ文字 ? は直前の文字
を選択可能にしています。 この記号は直前の文字の0個または1個のインスタンスにマッチします。 例えば,正規表現 ?he は次のような意味である。 オプションの大文字T、小文字h、小文字eの順です。

he => The car is parked in the garage.

正規表現

?he => The car is parked in the garage.

正規表現

をテストする2.4 中括弧

正規表現では、ある文字や文字のグループが
何回繰り返されるかを指定するために、定量化子とも呼ばれる中括弧が使用されます。 例えば、正規表現{2,3}は次のような意味です。 2桁以上3桁以下(0から9の範囲の文字)にマッチする。

{2,3} => The number was 9.9997 but we rounded it off to 10.0.

正規表現をテストする

2番目の数字を省略することができます。 例えば、正規表現
{2,}は、次のような意味です。 2桁以上の数字にマッチする。 カンマも削除すると、
正規表現{3}は次の意味になる。

{2,} => The number was 9.9997 but we rounded it off to 10.0.

正規表現のテスト

{3} => The number was 9.9997 but we rounded it off to 10.0.

正規表現のテスト

2.5 文字グループ

文字グループとは、括弧 (…) で囲まれたサブパターンのグループである。 前に説明したように、正規表現では、ある文字の後に量記号を置くと、その前の文字を繰り返すことになる。 しかし、文字群の後に量化子を置くと、その文字群全体が繰り返される。 例えば、正規表現 (ab)*ab という文字のゼロ回以上の繰り返しにマッチします。 また、文字グループ内のメタ文字に交替記号|を使うこともできます。 例えば、正規表現(c|g|p)arは、小文字のcgpのいずれかと、文字のa、文字のrに続くことを意味します。

(c|g|p)ar => The car is parked in the garage.

正規表現をテストする

2.6 Alternation

正規表現では縦棒 | は alternation を定義するのに 使うことができます。 alternationは複数の式の間の条件のようなものである。 さて、文字セットと交替は同じようなものだと思うかもしれません。 しかし、文字集合と交替の大きな違いは、文字集合は文字のレベルで動作するのに対し、交替は式のレベルで動作することです。 例えば、正規表現 (T|t)he|car は、大文字 T または小文字 t の後に小文字 h が続き、その後に小文字 e または小文字 c の後に小文字 a が続き、その後に小文字 r が続くことを意味します。

(T|t)he|car => The car is parked in the garage.

正規表現のテスト

2.7 特殊文字のエスケープ

バックスラッシュ \ は正規表現で次の文字をエスケープするために使用されます。 これによって、予約文字{ } / \ + * . $ ^ | ?を含む記号をマッチング文字として指定することができます。

例えば、正規表現の . は、
改行以外のすべての文字にマッチするように使われます。 さて、入力文字列中の . にマッチするには、正規表現 (f|c|m)at\.? は、小文字 f, c, m と小文字
文字 a, 小文字 t, 任意の文字 . に続くという意味です。

(f|c|m)at\.? => The fat cat sat on the mat.

正規表現のテスト

2.8 アンカー

正規表現では、マッチするシンボルが入力文字列の
開始シンボルまたは終了シンボルであるかどうかを調べるためにアンカーを使用します。 アンカーには2種類ある。 最初のタイプはマッチする文字が入力の開始
文字であるかどうかをチェックするキャレット^で、2番目のタイプはマッチする
文字が入力文字列の最後の文字であるかどうかをチェックするダラー$です。

2.8.1 キャレット

キャレット ^ 記号はマッチする文字が入力文字列の最初の
文字かどうかをチェックするのに使用されます。 入力文字列 abc に次の正規表現 ^a を適用すると (a が開始記号
の場合)、 a にマッチする。 しかし、上記の入力文字列に正規表現 ^b を適用すると、何もマッチしない。 なぜなら、入力文字列 abc では b は開始シンボルではないからです。 別の正規表現 ^(T|t)he を見てみましょう。これは、大文字 T または小文字 t が入力文字列の開始記号で、
小文字 h が続き、さらに小文字 e が続くことを意味します。

(T|t)he => The car is parked in the garage.

正規表現のテスト

^(T|t)he => The car is parked in the garage.

正規表現のテスト

2.8.2 ドル

ドル$記号は、マッチする文字が入力文字列の最後の文字
かどうかを調べるために使用されます。 例えば、正規表現(at\.)$は、小文字a、小文字t.と続き、マッチする文字が文字列の最後でなければならないことを意味します。

(at\.) => The fat cat. sat. on the mat.

正規表現のテスト

(at\.)$ => The fat cat. sat. on the mat.

正規表現のテスト

短縮文字セット

正規表現はよく使われる文字セットに対して便利な短縮文字セットを提供します。

Lookbehind と lookahead (lookaround とも呼ばれます) は、
非捕捉グループ (pattern と一致するが matching list には含まれない) の特殊なタイプです。 ルックアヘッドは、このパターンの前後に別の特定のパターンがあるという条件がある場合に使用されます。 例えば、次の入力文字列 .44 and .88 から $ で始まるすべての数字を取得したいとする。 この場合、次の正規表現 (?<=$)* を使用する。これは、「.文字を含み、$ 文字に先行するすべての数字を取得する」という意味である。 以下は正規表現で使用される回避策です:

4.1 正の先読み

式の最初の部分は
その後に先読み式の続く必要があると主張するものである。 返されるマッチは、式の最初の部分でマッチしたテキストのみを含みます。 正の
先読みを定義するために、括弧が使われる。 その括弧の中では、次のように等号付きのクエスチョンマークが使われる。 (?=…). ルックアヘッド式は、括弧内の等号の後に書かれる。 例えば、正規表現
(T|t)he(?=\sfat) は、小文字の t か大文字の T の後に文字 h が続き、さらに文字 e が続く場合にマッチする、という意味である。 括弧の中で正のルックヘッドを定義し、正規表現エンジンに単語fatに続くTheまたはtheにマッチするように伝える。

(T|t)he(?=\sfat) => The fat cat sat on the mat.

正規表現をテストする

4.2 負のルックヘッド

負のルックヘッドは、パターンに続いていない入力文字列
からすべてのマッチを取得したいときに使用する。 ネガティブルックヘッドはポジティブルックヘッドの定義と同じだが、唯一の違いは等しい = 文字の代わりに否定 ! 文字、つまり (?!…) を使うことである。 次の正規表現(T|t)he(?!\sfat)を見てみよう。意味は「入力文字列から、スペース文字の前に単語fatが続かない、すべてのTheまたはthe単語を取得する」

(T|t)he(?!\sfat) => The fat cat sat on the mat.

正規表現のテスト

4.3 Positive Lookbehind

Positive lookbehindは
特定のパターンに先行するすべてのマッチを取得するために使用されます。 Positive lookbehindは(?<=…)で示される。 例えば、正規表現 (?<=(T|t)he\s)(fat|mat) は、入力文字列から単語 The または the の後にあるすべての fat または mat を取得することを意味する。

(?<=(T|t)he\s)(fat|mat) => The fat cat sat on the mat.

正規表現をテストする

4.4 負の探索機能

負の探索機能は
固有のパターンで始まっていないすべてのマッチを取得するために使用される。 ネガティブ・ルックビハインドは (?<!…) で示される。 例えば、正規表現 (?<!(T|t)he\s)(cat) は次のような意味である。 入力文字列から、単語 The または the の後にない cat 語をすべて取得する。

(?<!(T|t)he\s)(cat) => The cat sat on cat.

正規表現のテスト

Flags

フラグは、正規
表現の出力を変更するので修飾語とも呼ばれます。 これらのフラグは任意の順序や組み合わせで使用でき、
RegExp の不可欠な部分です。

5.1 Case Insensitive

i 修飾子は、ケースインセンスなマッチを行うために使用されます。 例えば、正規表現/The/giは、大文字Tの後に小文字h、その後に文字eが続くことを意味します。 そして、正規表現の最後にある i フラグは、大文字小文字を無視するように正規表現エンジンに指示する。

The => The fat cat sat on the mat.

正規表現のテスト

/The/gi => The fat cat sat on the mat.

正規表現のテスト

5.2 グローバル検索

g修飾子はグローバルマッチ(最初のマッチで停止せず、すべてのマッチを検索)を実行するために使用されます。 例えば、正規表現 /.(at)/g は、改行以外の任意の文字、小文字 a の後、小文字 t が続く、という意味である。 正規表現の最後にgフラグを指定したため、最初の1つだけでなく入力文字列のすべてのマッチを見つけることができます (これはデフォルトの動作です)。

/.(at)/ => The fat cat sat on the mat.

正規表現のテスト

/.(at)/g => The fat cat sat on the mat.

正規表現のテスト

5.3 複数行

修飾子は複数行マッチに使用されます。 先に説明したように、
アンカー (^, $)はパターンが入力文字列の最初か最後かを確認するために使用されます。 しかし、アンカーを各行で動作させたい場合は、
mフラグを使用する。 例えば、正規表現 /at(.)?$/gm は、小文字 a の後に小文字の t、さらに
以外は改行する、という意味である。 そして m フラグのおかげで、正規表現エンジンは文字列の各行の終わりにパターンにマッチするようになった。 ? を使用すると、遅延マッチング、つまり可能な限り短くマッチングすることができます

/(.*at)/ => The fat cat sat on the mat.

正規表現のテスト

/(.*?at)/ => The fat cat sat on the mat.

正規表現のテスト

以上でこのポストを終了します。 この記事がお役に立てれば幸いです。 regexr.comやregex101.comなどのサービスを使って、学んだことを必ず実践してください。

コメントを残す

メールアドレスが公開されることはありません。