JavaScript引用タイプ——RegExpタイプ

7386 ワード

RegExpタイプ
ECMAScriptはRegExpタイプで正規表現をサポートします.次のような構文を使って正規表現を作成できます.
var expression = / pattern / flags;
パターン部分は、任意の単純または複雑な正規表現としてもよく、文字クラス、限定子、グループ、前向き検索、逆参照を含むことができます.各正規表現は、正規表現の挙動を示すために1つ以上のフラグを持つことができます.正規表現のマッチングモードは、次の3つのフラグをサポートします.
  • g:グローバル(global)モードを表し、第1マッチが発見された時点で
  • を停止する代わりに、モードはすべての文字列に適用されます.
  • i:大文字と小文字を区別しないモード、すなわちマッチング項目を決定する際に、文字列の大文字とパターンを無視する
  • を表します.
  • m:マルチライン(multiiline)モードを表し、つまりテキストの行の末尾に到達すると、次の行にパターンにマッチするエントリがあるかどうか検索し続けます.
  • /**
     *         "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に戻ります.
  • .RegExpの例示的な属性RegExpの各例は、以下のような属性を有しており、これらの属性を通じて、これらのモードに関する様々な情報を取得することができる.
  • global:ブール値、軽蔑はgフラグを設定しているかどうか
  • ignoreCase:ブール値は、iフラグ
  • が設定されているかどうかを示す.
  • lastIndex:整数は、次のマッチするアイテムの検索を開始する文字位置を表し、0から
  • を計算する.
  • multiiline:ブール値は、mフラグが設定されているかどうかを示しています.
  • source:正規表現の文字列表現は、入力されたコンストラクタの文字列パターンではなく文字列量の形式で返されます.
  • これらの属性を通して、正規表現の各方面の情報を知ることができます.シングル全体はあまり役に立たないです.これらの情報はモード宣言に含まれています.
    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"
    
  • .RegExpの例示的な方法RegExpオブジェクトの主な方法は、キャプチャグループのために設計されたexec()である.exec()は、モードを適用する文字列のパラメータを受け取り、最初のマッチ情報を含む配列を返します.または、マッチするものがない場合はnullを返します.戻り配列は、Arayの例であるが、2つの追加的な属性:indexとinputを含む.indexは文字列内のマッチする項目の位置を表し、inputは正規表現を適用する文字列を表します.配列では、最初の項目はモード全体にマッチする文字列であり、他の項目はモード中のキャプチャグループにマッチする文字列である.モード中にグループが取り込まれていない場合、配列は一つだけ含まれる.
  • 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は正規表現自体を返します.
  • .RegExpアーキテクチャ属性
  • RegExpコンストラクタは、これらの属性が作用領域におけるすべての正規表現に適用され、実行される最近の正規表現動作に基づいて変化する属性を含む.これらは2つの方法でアクセスできます.
  • input($u):最近の一致文字列
  • lastMatch($&):最近のマッチ
  • lastParten(+):最近のマッチングの獲得グループ
  • lastConteext($):input文字列の中でlastMatch前のテキスト
  • multiiline(*):ブール値は、すべての表現がマルチラインモード
  • を使用しているかどうかを示しています.
  • right Conteext('):Input文字列のlastMatch後のテキスト
  • これらの動作を使用して、より具体的な情報をexc()またはtest()が実行する動作から抽出することができる.
    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
    }