学習ノート8—正規表現


目次
  • 正規表現を作成する
  • 属性例
  • 例の方法
  • RegExpアーキテクチャ属性
  • 正規表現は文字列内の文字の組み合わせにマッチするモードです.ECMAScriptはRegExpタイプで正規表現をサポートしています.正規表現も対象です.
    1正規表現を作成する
    次の2つの方法で正規表現を構築できます.(1)正規表現の字面量を使用します.
    let expression = /pattern/flags;
    
    スクリプトを読み込むと、正規表現の文字数がコンパイルされます.正規表現が変わらない場合には、この方法を使ってより良い性能を得ることができます.この正規表現のpatternは、文字類、限定類、グループ、前向き検索、逆参照を含む任意の簡単または複雑な正規表現であってもよい.各正規表現は、正規表現の挙動を制御するために、0個以上のフラグを持つことができます.マッチングモードのマークは以下の通りです.
  • g:グローバルモードは、検索文字列のすべての内容を表し、最初のマッチしたコンテンツが見つかったら終了するのではない.
  • i:大文字と小文字を区別しないで、検索マッチング時にpatternと文字列の大文字と小文字を無視することを表します.
  • m:マルチラインモードは、テキストの行の最後まで検索し続けることを示しています.
  • y:接着モードは、ラスIndexから開始された文字列のみを検索することを示す
  • u:Unicodeモードで、Unicodeマッチング
  • を有効にします.
  • s:dotAllモードは、元の文字を表し、任意の文字にマッチする(または\rを含む)
  • 異なるモードとマークを使うと、各種の正規表現を作成できます.
    //         “at”
    let pattern1 = /at/g;
    
    //     “bat” “cat”,     
    let pattern2 = /[bc]at/i;
    
    //     “at”        ,     
    let pattern3 = /.at/gi;
    
    他の言語の正規表現と似ていますが、すべての文字はモードでも意味を変えなければなりません.「\^$|」/*+.元文字は正規表現では1つまたは複数の特殊機能がありますので、これらの文字自体にマッチするには、バックスラッシュを使って変換しなければなりません.
    //     “bat” “cat”,     
    let pattern1 = /[bc]at/i;
    
    //     “[bc]at”,     
    let pattern2 = /\[bc\]at/i;
    
    //     “at”        ,     
    let pattern3 = /.at/gi;
    
    //    “.at”,     
    let pattern = /\.at/gi;
    
    正規表現の特殊文字:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
    (2)RegExpはスクリプト実行中にコンパイルされます.正規表現が変更されたり、ユーザー入力などのソースから動的に生成されたりする場合は、構文関数を使って正規表現を作成する必要があります.前の例では、文字どおりの量で表現が定義されています.正規表現はRegExp構成も使用できます.関数を作成します.2つのパラメータを受信します.モード文字列とマーク文字列.字面量で定義された正規表現も構造関数で作成できます.
    //     "bat" "cat",     
    let pattern1 = /[bc]at/i;
    
    // pattern1  ,            
    let pattern2 = new RegExp("[bc]at","i");
    
    ここでのpattern 1とpattern 2は等価な正規表現です.*RegExpコンストラクタの2つのパラメータは文字列です.*はRegExpのモードパラメータが文字列なので、場合によっては二次変換が必要です.すべての元の文字は二次変換が必要です.例えば、変換記号シーケンスを含めて、(\転送後の文字列は\、正規表現文字列では\\と表記します)また、RegExpを使っても既存の正規表現の例に基づいて、それらのタグを選択的に変更できます.
    const re1 = /cat/g;
    console.log(re1); //"/cat/g"
    
    const re2 = new RegExp(re1);
    console.log(re2); //"/cat/g"
    
    const re3 = new RegExp(re1,"i");
    console.log(re3); //"/cat/i"
    
    2インスタンスのプロパティ
    各RegExp例には、以下のような属性があり、モードに関する様々な情報が提供される.
  • global:ブール値は、gマークが設定されているかどうかを示します.
  • ignoreCase:ブール値は、iマーク
  • が設定されているかどうかを示す.
  • unicode:ブール値は、uマーク
  • が設定されているかどうかを示しています.
  • sticky:ブール値は、yマークが設定されているかどうかを示しています.
  • lastIndex:整数は、ソース文字列における次の検索の開始位置を表し、常に0から
  • を開始する.
  • multiiline:ブール値は、mタグ
  • が設定されているかどうかを示しています.
  • dotAll:ブール値は、sマーク
  • が設定されているかどうかを示しています.
  • source:正規表現の文字数文字列で、先頭と最後のバーがない
  • flags:正規表現のマーク文字列.文字列の量で構成関数に入ってきた文字列パターンが元に戻ります.
  • 3例の方法
    RegExpの例の主な方法はexec()である.この方法は主にTrapグループに協力して使用します.一つのパラメータ、すなわちアプリケーションモードの文字列しか受け入れられません.マッチするものが見つかったら、最初のマッチ情報を含む配列を返します.マッチするものが見つからなかったらnullに戻ります.返した配列はArayの例ですが、2つの追加的な属性:indexとinputを含みます.indexは文字列にマッチするモードです.の開始位置、inputは検索する文字列です.この配列の最初の要素はモード全体にマッチする文字列で、他の要素は表式のキャプチャグループにマッチする文字列です.パターンにはキャプチャ行列がない場合、配列は要素だけを含みます.
    let text = "mom and dad and baby";
    let pattern = /mom(and dad(and baby)?)?/gi;
    
    let matches = pattern.exec(text);
    console.log(matches.index); //0
    console.log(matches.input); //"mom and dad and baby"
    console.log(matches[0]); //mom and dad and baby
    console.log(matches[1]); //"and dad and baby"
    console.log(matches[2]); //"and baby"
    
    この例では、モードは2つの捕捉グループを含み、最も内部の整合項「and baby」と外部の整合項「and dad」または「and dad and baby」と呼ばれるexec()を呼び出す.をクリックしてマッチする項目を見つけました.文字列整合モード全体のために、matchs配列index属性は0です.配列の最初の要素は整合された文字列全体です.第二の要素は最初のキャプチャグループにマッチする文字列で、第三の要素は第二のキャプチャグループにマッチする文字列です.モードがグローバルタグを設定している場合、毎回exec()を呼び出します.この方法はマッチした情報を返します.グローバルタグが設定されていない場合は、同じ文字列に対して何回exec()を呼び出しても、最初のマッチ情報だけを返します.
    let text = "cat,bat,sat,fat";
    let pattern = /.at/;
    
    let matches = pattern.exec(text);
    console.log(matches.index);//0
    console.log(matches[0]); //cat
    console.log(pattern.lastIndex);//0
    
    matches = pattern.exec(text);
    console.log(matches.index);//0
    console.log(matches[0]); //cat
    console.log(pattern.lastIndex); //0
    
    上記の例のモードはグローバルフラグが設定されていないので、exec()を呼び出して最初のマッチ(cat)だけを返します.lastIndexは非グローバルモードでは常に変化しません.このモードでgタグを設定すると、exec()を呼び出すたびに文字列の中から次のマッチを検索します.
    let text = "cat,bat,sat,fat";
    let pattern = /.at/g;
    let matches = pattern.exec(text);
    console.log(matches.index);//0
    console.log(matches[0]);//cat
    console.log(pattern.lastIndex);//3
    
    matches = pattern.exec(text);
    console.log(matches.index);//4
    console.log(matches[0]);//bat
    console.log(pattern.lastIndex);//7
    
    matches = pattern.exec(text);
    console.log(matches.index);//8
    console.log(matches[0]);//sat
    console.log(pattern.lastIndex);//11
    
    今回のモードではグローバルタグが設定されていますので、exec()を呼び出すたびに文字列の最後まで次のマッチを返します.パターンのlastIndex属性は毎回変化します.グローバルマッチングモードでは、exc()を呼び出すたびに、exc()を呼び出します.最後に一致した最後の文字の索引を反映するためにラストインデクス値を更新します.パターンが接着マークyを設定している場合は、exec()を呼び出すたびに、ラストインデクスの位置だけでマッチ項目を探します.
    let text = "cat,bat,sat,fat";
    let pattern = /.at/y;
    
    let matches = pattern.exec(text);
    console.log(matches.index); //0
    console.log(matches[0]); //cat
    console.log(pattern.lastIndex); //3
    
    //   3             ,  exec()  null
    //exec()      ,   lastIndex   0
    matches = pattern.exec(text);
    console.log(matches); //null
    console.log(pattern.lastIndex); //0
    
    //    lastIndex          exec()        
    pattern.lastIndex = 5;
    matches = pattern.exec(text);
    console.log(matches.index); //5
    console.log(matches[0]); //bat
    console.log(pattern.lastIndex); //8
    
    正規表現のもう一つの方法はtest()で、文字列パラメータを受信し、入力されたテキストドメインパターンが一致すると、パラメータはtrueに戻ります.そうでないとfalseに戻ります.この方法は実際のマッチングが必要ではなく、モードのみをテストしたい場合に適用されます.test()は常にif文で使用されます.
    let text = "000-00-0000";
    let pattern = /\d{3}-\d{2}-\d{4}/;
    
    if (pattern.test(text)){
         
    	console.log("The pattern was matched.");
    }
    
    この使い方はユーザー入力の検証によく使われています.入力が有効かどうかだけに関心があります.なぜ無効なのかは気にしません.正規表現がどのように作成されたのかに関わらず、継承された方法toLocall String()とtoString()は正規表現の字面量を返します.
    let pattern = new RegExp("\\[bc\\]at","gi");
    console.log(pattern.toString()); // /\[bc\]at/gi
    console.log(pattern.toLocaleString()); // /\[bc\]at/gi
    
    4 RegExpコンストラクタ属性
    RegExpコンストラクタ自体にもいくつかの属性があります.これらの属性は、フィールド内のすべての表現に適用され、最後に実行される正規表現の操作によって変化します.これらの属性には、2つの異なる方法でアクセスできるという特徴があります.つまり、各属性にはフルネームと簡単な書き方があります.
    フルネーム
    簡体字
    説明
    input
    $u
    最後に検索した文字列(標準以外の特性)
    lastMatch
    $
    最後にマッチしたテキスト
    lastParten
    ドル+
    最後に一致した捕獲グループ(非標準特性)
    left Cotext
    $
    input文字列の中でlastMatchの前の文字列が現れます.
    ライトアウト
    $
    input文字列の中でlastMatchの後ろのテキストが現れます.
    let left = "this has been a short summer";
    let pattern = /(.)hort/g;
    
    if(pattern.test(text)){
         
    	console.log(RegExp.input);//this has been a short summer
    	console.log(RegExp.leftContext);//this has been a
    	console.log(RegExp.rightContext);//summer
    	console.log(RegExp.lastMatch);//short
    	console.log(RegExp.lastParen);//s
    }
    
    これらの属性名は、簡略化された形式に置き換えることもできます.ただし、括弧文法を使用してアクセスします.
    let text = "this has been a short summer";
    let pattern = /(.)hort/g;
    
    if(pattern.test(text)){
         
    	console.log(RegExp["$`"]);
    }
    
    RegExpにはいくつかのコンストラクション属性があります.最大9つのTrapグループマッチング項目を記憶できます.これらの属性はRegExp.$1~RegExp.$9でアクセスします.それぞれ第1〜9つのグループのマッチング項目が含まれています.exc()またはtest()を呼び出すと、これらの属性が充填され、以下のように使用できます.
    let text = "this has been a short summer";
    let pattern = /(..)or(.)/g;
    
    if(pattern.test(text)){
         
    	console.log(RegExp.$1);//sh
    	console.log(RegExp.$2);//t
    }
    
    この例では、モードは2つの捕獲グループを含む.