Visit Mozilla.org

Core JavaScript 1.5 Reference:Global Objects:RegExp:exec

出典: MDC


目次

[編集] 概要

特定の文字列でのマッチのための検索を実行します。結果の配列、あるいは、null が返ります。

RegExp のメソッド
実装されたバージョン: JavaScript 1.2, NES3.0
ECMA バージョン: ECMA-262, Edition 3 (最初の構文のみ)


[編集] 構文

var result1 = regexp.exec(str);
var result2 = regexp(str); // Mozilla 拡張

[編集] 引数

regexp 
正規表現の名前。変数名かリテラル。
str 
正規表現にマッチするかどうかの対象となる文字列。

[編集] 説明

構文の説明で示されているように、正規表現の exec メソッドは、直接的 (regexp.exec(str)) 、もしくは、間接的 (regexp(str)) に呼ばれます。

単に、マッチが真か偽かを調べたい場合は、test メソッド か、String.search メソッドを使ってください。

マッチが成功した場合、 exec メソッドは、配列を返し、正規表現オブジェクトのプロパティを更新します。 マッチが失敗した場合は、exec メソッドは null を返します。

以下の例を考えてください。:

// 1 つの d 、それに続く、1 つ以上の b 、それに続く、1 つの d にマッチします。
// b のマッチとそれに続く d のマッチをそれぞれ覚えておきます。
// 大文字、小文字を無視します。
 var myRe = /d(b+)(d)/ig
 var myArray = myRe.exec("cdbBdbsbz");

以下の表が、このスクリプトの結果を示しています。:

オブジェクト プロパティ / 配列番号 説明
myArray   myArray の内容 ["dbBd", "bB", "d"]
index 文字列のマッチの 0 ベースの位置【訳注: 0 は、 /^/ でマッチする、文字列の開始位置】 1
input 元の文字列。 cdbBdbsbz
[0] 最後にマッチした文字 dbBd
[1], ...[n] 括弧で囲まれた部分文字列のマッチ。括弧で囲まれた部分文字列の数に制限はありません。 [1] = bB
[2] = d
myRe lastIndex 次のマッチが始まる位置。 5
ignoreCase 大文字小文字を区別しない、"i" フラグが指定されているかどうか。 true
global グローバルマッチのための、"g" フラグが指定されているかどうか。 true
multiline 複数行に渡って文字列を検索する、"m" フラグが指定されているかどうか。 false
source パターンのテキスト。 d(b+)(d)

正規表現で "g" フラグを使用する場合、同じ文字列で成功するマッチを見つけるために exec メソッドを複数回使うことができます。そのときの検索は、正規表現の lastIndex プロパティで指定された、str の部分文字列から開始されます。例えば、このスクリプトで考えてみてください。:

var myRe=/ab*/g;
var str = "abbcdefabh";
var myArray;
while ((myArray = myRe.exec(str)) != null) {
 var msg = "myArray[0] + " を見つけました。";
  msg += "次のマッチは " + myRe.lastIndex + " からです。"
  print(msg);
}

このスクリプトは以下のテキストを表示します。:

abb を見つけました。次のマッチは 3 からです。
ab を見つけました。次のマッチは 9 からです。

[編集]

[編集] 例: exec の使用

以下の例では、ユーザは名前を入力し、スクリプトが入力に対してのマッチを実行します。その処理は、配列によって、他の名前がユーザの名前にマッチするかわかるまで、繰り返されます。

このスクリプトは、パーティデータベースから集められたであろう、登録されたパーティの出席者のファーストネームが配列 A にあらかじめ読み込まれていることを仮定しています。

var A = ["Frank", "Emily", "Jane", "Harry", "Nick", "Beth", "Rick",
      "Terrence", "Carol", "Ann", "Terry", "Frank", "Alice", "Rick",
      "Bill", "Tom", "Fiona", "Jane", "William", "Joan", "Beth"];

function lookup(input) {
   var firstName = /\w+/i.exec(input.value);
   if (!firstName)
   {
      print (input.value + " isn't a name!");
      return;
   }
  var count = 0;
  for (var i = 0; i < A.length; i++)
  {
    if (firstName[0].toLowerCase() == A[i].toLowerCase())
      count++;
  }
  var midstring = count == 1
                ? " other has ";
                : " others have ";
  print("Thanks, " + count + midstring + "the same name!")
}