JavaScript引用タイプ——RegExpタイプ
7386 ワード
RegExpタイプ
ECMAScriptはRegExpタイプで正規表現をサポートします.次のような構文を使って正規表現を作成できます. g:グローバル(global)モードを表し、第1マッチが発見された時点で を停止する代わりに、モードはすべての文字列に適用されます. i:大文字と小文字を区別しないモード、すなわちマッチング項目を決定する際に、文字列の大文字とパターンを無視する を表します. m:マルチライン(multiiline)モードを表し、つまりテキストの行の末尾に到達すると、次の行にパターンにマッチするエントリがあるかどうか検索し続けます. .RegExpの例示的な属性RegExpの各例は、以下のような属性を有しており、これらの属性を通じて、これらのモードに関する様々な情報を取得することができる. global:ブール値、軽蔑はgフラグを設定しているかどうか ignoreCase:ブール値は、iフラグ が設定されているかどうかを示す. lastIndex:整数は、次のマッチするアイテムの検索を開始する文字位置を表し、0から を計算する. multiiline:ブール値は、mフラグが設定されているかどうかを示しています. source:正規表現の文字列表現は、入力されたコンストラクタの文字列パターンではなく文字列量の形式で返されます. これらの属性を通して、正規表現の各方面の情報を知ることができます.シングル全体はあまり役に立たないです.これらの情報はモード宣言に含まれています..RegExpの例示的な方法RegExpオブジェクトの主な方法は、キャプチャグループのために設計されたexec()である.exec()は、モードを適用する文字列のパラメータを受け取り、最初のマッチ情報を含む配列を返します.または、マッチするものがない場合はnullを返します.戻り配列は、Arayの例であるが、2つの追加的な属性:indexとinputを含む.indexは文字列内のマッチする項目の位置を表し、inputは正規表現を適用する文字列を表します.配列では、最初の項目はモード全体にマッチする文字列であり、他の項目はモード中のキャプチャグループにマッチする文字列である.モード中にグループが取り込まれていない場合、配列は一つだけ含まれる. .RegExpアーキテクチャ属性 RegExpコンストラクタは、これらの属性が作用領域におけるすべての正規表現に適用され、実行される最近の正規表現動作に基づいて変化する属性を含む.これらは2つの方法でアクセスできます. input($u):最近の一致文字列 lastMatch($&):最近のマッチ lastParten(+):最近のマッチングの獲得グループ lastConteext($):input文字列の中でlastMatch前のテキスト multiiline(*):ブール値は、すべての表現がマルチラインモード を使用しているかどうかを示しています. right Conteext('):Input文字列のlastMatch後のテキスト これらの動作を使用して、より具体的な情報をexc()またはtest()が実行する動作から抽出することができる.
ECMAScriptはRegExpタイプで正規表現をサポートします.次のような構文を使って正規表現を作成できます.
var expression = / pattern / flags;
パターン部分は、任意の単純または複雑な正規表現としてもよく、文字クラス、限定子、グループ、前向き検索、逆参照を含むことができます.各正規表現は、正規表現の挙動を示すために1つ以上のフラグを持つことができます.正規表現のマッチングモードは、次の3つのフラグをサポートします./**
* "at"
*/
var parttern1 = /at/g;
/**
* "bat" "cat",
*/
var parttern2 = /[bc]at/i;
/**
* "at" 3 ,
*/
var parttern3 = /.at/gi;
モードで使用するすべての要素の文字は、変換されなければなりません.正規表現の要素文字は以下の通りです.( [ { \ ^ $ | ) ? * + . ] }
これらの要素文字は正規表現では1つまたは複数の用途があるので、文字列の中に包まれているこれらの文字にマッチするには、それらを変換する必要があります.例えば:/**
* "bat" "cat",
*/
var parttern1 = /[bc]at/i;
/**
* "[bc]at",
*/
var parttern2 = /\[bc\]at/i;
/**
* "at" 3 ,
*/
var parttern3 = /.at/gi;
/**
* ".at" 3 ,
*/
var parttern3 = /\.at/gi;
これらの例は文面量で定義された正規表現です.もう一つの正規表現を作成する方法は、RegExpコンストラクタを使用して、二つのパラメータを受信します.一つは一致する文字列モードで、もう一つはオプションのフラグ文字列です./**
* "bat" "cat",
*/
var parttern1 = /[bc]at/i;
var parttern2 = new RegExp("[bc]at","i");
RegExpコンストラクタに渡す二つのパラメータは文字列です.RegExpコンストラクタのモードパラメータは文字列なので、場合によっては文字を二重変換します./\[bc\]at/——"\\\[bc\\\]at"
/\\.at/——"\\\\.at"
/name\/age/——"name\\\\/age"
/\d.\d{1,2}/——"\\\\d.\\\\d{1,2}"
/\w\hello\\123/——"\\\\w\\\\hello\\\\123"
は、正規表現を使用する字面量とRegExp構成関数を使用する正規表現とは異なる.ECMAScript 3では、正規表現の字面量は常に同じRegExp例を共有し、構造関数を用いて作成された新しいRegExpの例はいずれも新しい例である.var re = null,
i;
for(i=0; i<10; i++){
re = /cat/g;
re.test("catastrophe");//
}
for(i=0; i<10; i++){
re = new RegExp("cat", "g");
re.test("catastrophe");
}
第1のサイクルでは、たとえ循環体で指定されていても、実際には、/cat/のためのRegExp例が作成されている.インスタンス属性はリセットされないので、ループ中に再びtest()を呼び出す方法は失敗します.これはtestを呼び出すのが初めてですが、2回目の呼び出しはインデックスが3の文字(前回のマッチの末尾)から始まりましたので、見つけられませんでした.文字列の末尾までテストされますので、次回はtest()を呼んでからやり直します.第二のループは、RegExpコンストラクタを使用して、各ループのまとめごとに正規表現を作成します.反復ごとに新しいRegExpインスタンスが作成されるので、test()を呼び出すたびにtrueに戻ります.var pattern1 = /\[bc\]at/i;
alert(pattern1.glable); //false
alert(pattern1.ignoreCase); //true
alert(pattern1.multiline); //false
alert(pattern1.lastIndex); //0
alert(pattern1.source); //"\[bc\]at"
var pattern2 = new RegExp("\\[bc\\]at","i");
alert(pattern2.glable); //false
alert(pattern2.ignoreCase); //true
alert(pattern2.multiline); //false
alert(pattern2.lastIndex); //0
alert(pattern2.source); //"\[bc\]at"
var text = "mom and dad and baby";
var pattern = /mom(and dad(and baby)?)?/gi;
var matches = pattern.exec(text);
alert(matches.index); //0
alert(matches.input); //"mom and dad and baby"
alert(matches[0]); //"mom and dad and baby"
alert(matches[1]); //"and dad and baby"
alert(matches[2]); //"and baby"
この例には二つの捕獲グループが含まれている.グループ内の捕獲グループは「and baby」にマッチし、その捕獲グループは「and baby」または「and dad and baby」に適合する.文字列をexec()メソッドに入力すると、マッチするアイテムが見つかった.文字列全体がモードにマッチするため、返ってくる配列matchのindex属性値は0です.配列の第一項は整合した文字列全体であり、第二項は第一の捕獲グループと一致するコンテンツを含み、第三項は第二の捕獲グループと一致するコンテンツを含む.exec()方法では、モードにグローバルフラグ(g)が設定されていても、その度にマッチするエントリだけが返されます.グローバルフラグが設定されていない場合、同じ文字列でexec()を何度も呼び出したら、常に最初のマッチ項目の情報を返します.グローバルフラグを設定する場合、exx()を呼び出すたびに、新しいマッチを文字列で検索し続けます.var text = "cat, bat, sat, fat";
var pattern1 = /.at/;
var matches = pattern1.exec(text);
alert(matches.index); //0
alert(matches[0]); //cat
alert(pattern1.lastIndex); //0
matches = pattern1.exec(text);
alert(matches.index); //0
alert(matches[0]); //cat
alert(pattern1.lastIndex); //0
var pattern2 = /.at/g;
var matches = pattern2.exec(text);
alert(matches.index); //0
alert(matches[0]); //cat
alert(pattern2.lastIndex); //3
matches = pattern2.exec(text);
alert(matches.index);//5
alert(matches[0]); //bat
alert(pattern2.lastIndex); //8
test()メソッドは文字列パラメータを受け入れます.モードがパラメータと一致する場合はtrueを返します.そうでなければfalseを返します.対象文字の転送があるモードと一致するかどうかを知っていることを指すが、そのテキストの内容を知る必要がない場合には、この方法が非常に便利である.test()メソッドはしばしばif文として用いられる.var text = "000-00-0000";
var pattern = /\d(3)-\d(2)-d(4)/;
if (pattern.test(text)) {
alert('The pattern was matched.');
}
この方法はしばしばユーザ入力を検証する場合に現れる.RegExpの例を引き継ぐtoLocareStering()とtoStering()の方法は、正規表現の字面量を返します.正規表現を作成する方法とは関係ありません.例えば:var pattern = new RegExp("\\[bc\\]at","gi");
alert(pattern.toString()); // /\[bc\]at/gi
alert(pattern.toLocaleString()); // /\[bc\]at/gi
正規表現のvalueOfは正規表現自体を返します.var text = "this has been a short summer";
var pattern = /(.)hort/g;
if (pattern.test(text)) {
alert(RegExp.input); //this has been a short summer
alert(RegExp.leftContext); //this has been a
alert(RegExp.rightContext); //summer
alert(RegExp.lastMatch); //short
alert(RegExp.lastParen); //s
alert(RegExp.multiline); //false
}
var text = "this has been a short summer";
var pattern = /(.)hort/g;
if (pattern.test(text)) {
alert(RegExp.$_); //this has been a short summer
alert(RegExp["$`"]); //this has been a
alert(RegExp["$'"]); //summer
alert(RegExp["$&"]); //short
alert(RegExp["$+"]); //s
alert(RegExp["$*"]); //false
}
また,捕獲グループの構造関数属性を格納するために9つまでのものがある.これらの属性にアクセスするシンタックスはRegExp.$1,RegExp.$2,…RecExp.$9であり、それぞれ第1,第2…第9のマッチングを格納するために使用されます.exec()を呼び出した後、test()メソッドは、これらの属性が自動的に塗りつぶされます.var text = "this has been a short summer";
var pattern = /(..)or(.)/g;
if (pattern.test(text)) {
alert(RegExp.$1); //sh
alert(RegExp.$2); //t
}