正規表現-グループを取り込む


PS:この文章を読む前に、以下の知識が必要です.
  • 正規表現の基本文法
  • String.prototype.replace()
  • String.prototype.match()
  • キャプチャグループ(capturing group)は正規表現でよく使われています.比較的重要な概念です.私はこの部分の知識を身につけることが大切だと思います.この文章は内容がそんなに深くないですが、できるだけ分かりやすく、全面的にしてください.次の内容は主に以下の7つの点をめぐっています.
    1:()キャプチャグループ2:(?)(?)non capturing group 3:(?=)positive lookahead 4:(?!)negative look aaead 5:(?"=)positive lookbehind 6:(?7:(?=),(?),(?),(?<=)
    1:()キャプチャグループ
    /go+/
    以上の正規表現は、1つの文字gの後に1つまたは複数のアルファベットoがついてくることを表しています.彼はgoまたはgooooにマッチングできます.しかし、私たちは+をアルファベットoだけに使うのではなく、goという全体に使うにはどうすればいいですか?方法は、goに括弧をつけることです.
    /(go)+/
    全体的なマッチングと大きさを考慮しないために、私達はこれから私達の正則にigを加えます.この二つのフラッグ:
    let reg = /(go)+/ig;
    'go is g gogo'.match(reg); //["go", "gogo"]
    
    上記の例では、キャプチャグループが形成されています.次に、キャプチャグループを使用する例を見て、その理解を深めます.
    let reg = /(\d{2}).(\d{2}).(\d{4})/;
    let originString = '10.25.2017';
    reg.test(originString); //true
    RegExp.$1; //10
    RegExp.$2; //25
    RegExp.$2; //2017
    上記の例では、3つのグループの括弧を持ち、3つのグループを形成しました.正規表現(javaScriptでは私たちのRegExp)は、$nで表されるように、捕獲グループにマッチするシリアルをキャッシュします.
    もし今私たちが必要なものがあれば、表示フォーマットを10.25.2017にする時間を2017-10-25フォーマットに変更します.
    Stringのreplace()方法は常に正規表現と一緒に使用されることを知っています.replace()方法ではキャプチャグループの結果を直接使用できます.
    let reg = /(\d{2}).(\d{2}).(\d{4})/;
    let originString = '10.25.2017';
    let newString = originString.replace(reg, '$3-$1-$2');
    console.log(newString);//"2017-10-25"
    
    2:(?:)non capturing group非キャプチャ型パケットは、場合によってはグループにマッチしたいだけかもしれませんが、キャッシュ(キャプチャしたくない)マッチングの結果は、私たちのパケットモードの前に?:を追加することができます.例えば、上記の時間の例では、最初のグループの結果をキャプチャしたくないです.
    let reg = /(?:\d{2}).(\d{2}).(\d{4})/;
    let originString = '10.25.2017';
    reg.test(originString); //true
    RegExp.$1; //25
    RegExp.$2; //2017
    originString.match(reg);// ["10.25.2017", "25", "2017", index: 0, input: "10.25.2017", groups: undefined]
    
    上記の例から、正規表現は依然として整合している(test()の結果はtrueであるが、RegExp.$1は数字10ではなく、25である.なぜなら、最初の括弧のリガにいるから?:、10は捕獲されない.match()の実行結果も?:の影響を受ける.match()の結果には‘10’はない.
    3:(?=)positive look aead前向きにキャプチャされた文があります.1 apple cots 10€.€の前の価格に合わせたいですが、文の先頭の数字に合わないように注意してください.この場合、前向きにキャプチャします.
    let reg = /\d+(?=€)/g;
    let reg1 = /\d+/g;
    let str = '1 apple costs 10€';
    str.match(reg); //["10"]
    str.match(reg1); //["1", "10"]
    上記の例では、reg 1は数字にマッチするだけで、数字の後には何も要求されていないので、1、10にマッチします.しかし、regは展望型を使っています.10にしかマッチしません.上の比較から何が前向き型に捕獲されているかを知ることができます.
    //x(?=y)/整合xですが、xの【後ろ】【はい】yの場合は
    4:(?!)negative look aead負向前景型キャプチャ上で私達は何が前向きのマッチングなのかを知りました.字面の意味からも推測できます.負を前向きに捕獲します.
    //x(?!y)/整合xですが、xの【後ろ】【いいえ】yの場合は
    例えば、次の例では、€の前の2ではなく、デジタル1にマッチしたいです.?!を使用できます.
    let reg = /\d+(?!€)/g;
    let str = '1 apple costs 2€';
    str.match(reg); ['1']
    
    5:(?<=)positive look behindは後顧型に捕獲されて後顧型と展望型が正反対という意味です.
    //(?<=y)x/整合xですが、【前】【あり】yの場合のみ、一例を見ます.
    let str = "1 turkey costs $2";
    console.log( str.match(/(?<=\$)\d+/g) ); //["2"]
    ここの要求は前に$の数字があるので、ここでは数字2にマッチしています.
    6:(?負は正と逆で、負は後顧型に捕獲されます.
    //(?<=y)x/整合xですが、【前】【なし】yの場合のみ
    一例を見てみます.
    let str = "1 turkey costs $2";
    console.log( str.match(/(?
    7:(?=),(?),(?=),(?デフォルトでは上の展望4つはデフォルトではキャプチャグループの内容にマッチしない、つまり括弧内の条件に合わないです.例えば、私達の右側のかっこ/d+(?=€)/gは数文字にマッチしますが、€にはマッチしません.もし私達も€にマッチするなら、どうすればいいですか?
    let str = "1 turkey costs 2€";
    let reg = /\d+(?=(€))/; 
    str.match(reg); //["2", "€", index: 15, input: "1 turkey costs 2€", groups: undefined]
    これは、数字2とその後ろの€にマッチします.
    次にまた後顧のタイプを見てみます.
    let str = "1 turkey costs $2";
    let reg = /(?<=(\$|£))\d+/;
    console.log( str.match(reg) ); //["2", "$", index: 16, input: "1 turkey costs $2", groups: undefined]
    
    特に注意すべき点は、後顧型については、条件は整合項の前にあるが、マッチングした結果の順序は依然として条件が一致項の後にあるため、ここではmatch()が出てきた結果は2ドルの前にある.
    PS:これまで(ES 2015)、JavaScriptは後顧型のマッチングをサポートしていませんでした.つまり(?<=)です.