exec

概要

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

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

構文

var result1 = regexp.exec(str);

引数

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

説明

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

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

次の例を考えてください。

// 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 + " からです。";
  console.log(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){
      console.log (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 ";
  console.log("Thanks, " + count + midstring + "the same name!");
}

Document Tags and Contributors

Contributors to this page: Potappo, dextra, ethertank, Mgjbot
最終更新者: ethertank,