パターンとフラグ

正規表現(Regular expressions)は文字列内を検索したり置換するための強力な方法です。

JavaScriptでは、正規表現は組み込みの RegExp クラスのオブジェクトを使用して実装され、文字列と統合されています。

正規表現はプログラミング言語によって異なることに留意してください。このチュートリアルでは、JavaScript に焦点を当てます。もちろん共通点は多いですが、Perl, Ruby, PHP などとは多少異なります。

正規表現

正規表現(もしくは “regexp”, または単に “reg”) は パターン とオプションの フラグ で構成されています。

正規表現オブジェクトを生成するための2つの構文があります。

長い構文:

regexp = new RegExp("pattern", "flags");

…そして短い構文です。スラッシュ "/" を使います:

regexp = /pattern/; // フラグなし
regexp = /pattern/gmi; // g, m と i のフラグあり(詳細は後ほど説明します)

スラッシュ "/" は正規表現を作成していることを JavaScript に伝えます。文字列の引用符と同じ役割を果たします。

使用方法

文字列内を検索するためには、メソッド search を使うことができます。

例:

let str = "I love JavaScript!"; // ここを検索します

let regexp = /love/;
alert( str.search(regexp) ); // 2

str.search メソッドはパターン /love/ を探し、文字列内での位置を返します。ご推測の通り、 /love/ は最もシンプルなパターンです。それは簡単な部分文字列検索です。

上のコードは次と同じです:

let str = "I love JavaScript!"; // ここを検索します

let substr = 'love';
alert( str.search(substr) ); // 2

したがって、/love/ の検索は "love" の検索と同じです。

しかし、それは今だけです。すぐにより強力な検索機能を備えた、より複雑な正規表現作成していきます。

色

ここからの配色は次の通りです:

  • 正規表現 – red
  • 文字列 (検索する場所) – blue
  • 結果 – green
いつ new RegExp を使いますか?

通常は短い構文である /.../ を使います。しかし、これは変数の挿入を許可していないため、コードを書く時点で正確な正規表現を知っていなければなりません。

一方、new RegExp は文字列から動的にパターンを構築することができます。

したがって、検索するために必要なことを理解し、そこから new RegExp を作ることができます。:

let search = prompt("What you want to search?", "love");
let regexp = new RegExp(search);

// ユーザが望むものを見つける
alert( "I love JavaScript".search(regexp));

フラグ

正規表現には検索に影響を与えるフラグを含んでいる場合があります。

JavaScript には 5 つしかありません:

i
このフラグを指定すると、検索は大文字小文字を区別しません: Aa に違いはありません(下の例をみてください)。
g
このフラグを指定すると、検索はすべての一致を探します。指定がない場合は – 最初の1つのみを探します(次のチャプターで使い方を見ていきます)。
m
複数行モードです(チャプター 記事 "regexp-multiline" が見つかりません で説明します)。
u
完全なユニコードサポートを有効にします。このフラグはサロゲートペアの正しい処理を可能にします。より詳細についてはチャプター ユニコードフラグ を参照してください。
y
スティッキーモード(次のチャプター で説明します)。

“i” フラグ

最も簡単なフラグは i です。

その例です:

let str = "I love JavaScript!";

alert( str.search(/LOVE/) ); // -1 (見つからない)
alert( str.search(/LOVE/i) ); // 2
  1. 最初の検索は -1 (見つからない) を返します。なぜなら、デフォルトでは検索は大文字小文字を区別するためです。
  2. フラグ /LOVE/i を指定すると、検索は位置 2 に love を見つけます。

したがって、i フラグはすでに単純な部分文字列検索よりも強力な正規表現を作成します。しかし、まだまだはるかに多くのことがあります。次のチャプターでは、他のフラグと機能についても説明します。

サマリ

  • 正規表現はパターンとオプションのフラグ g, i, m, u, y で構成されます。
  • フラグと後で学ぶ特別な記号がなければ、正規表現による検索は部分文字列検索と同じです。
  • メソッド str.search(regexp) は一致するものが見つかった場所はそのインデックスを返します。見つからなかった場合は -1 を返します。
チュートリアルマップ

コメント

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