あなたは本当に正則修羅符を理解しますか?

3969 ワード

0、はじめに
一部のコードによる思考:
var r = /\d/g;
console.log(r.test('1'));
console.log(r.test('1'));
console.log(r.test('2'));
console.log(r.test('2'));
先に上のコードを見て、実行しないでください.自分で先に結果を推測します.
1、正則修飾子
正則は各言語において、実現の基準は完全に一致していない.ここではJavaScriptにおける実装について議論します.JavaScriptにおいて、正則は4つの修飾子があります.global, ignoreCase, multiline, unicode、詳細はMDN RegExpを参照してください.
それらの意味は以下の通りです.
  • global(g)は、文字列内のすべての可能な一致について正規表現
  • をテストする.
  • ignoreCase(i)マッチング時に、大文字小文字
  • を無視する.
  • multiiline(m)マルチライン入力は、複数行と見なされる(このとき開始^と終端が一致する$各行にマッチすることができる)
  • unicode(u)は文字列にunicodeを採用してマッチングします.
    修飾子:iiは分かりやすいです.マッチング時に、大文字と小文字は無視されます.
    var text = 'abc';
    var r = /abc/;
    console.log(r.test('abc')); // true
    console.log(r.test('Abc')); // false
    r = /abc/i;
    console.log(r.test('abc')); // true
    console.log(r.test('Abc')); // true
    修飾子:m複数行に一致する場合、デフォルトは全文マッチであり、mを使用した後、各行を個別にマッチングする.
    //         
    var text = `a b c
    
    A B C`;
    var r = /c$/; //    C     
    console.log(r.test(text)); // false      ,    
    r = /c$/m;
    console.log(r.test(text)); // true     ,c       ,    
    修飾子:u修飾子uを使用して、Unicodeモードでマッチングします.正則にunicodeを含めると効果が見られます.
    var r = /\u{61}/; //   61 u  
    console.log(r.test('a')); // false,       
    r = /\u{61}/u; // Unicode  ,\u{61} = 'a'
    console.log(r.test('a')); // true, Unicode    
    r = /\u{61}{3}/u; //   3 a,      
    console.log(r.test('aaa')); // true
    注意:/uモードでは、正則の中で\u{xxx}は一つの全体であり、分割できません.
    2、正則修飾子:g次に、本明細書の焦点に入り、修飾子gのマッチングモード.
    まず最初のコードに戻ります.大体の人の答えはtrue true true trueでしょう.
    実際、正解はtrue false true falseです.不思議ですか?続いて下を見る
    RegExp.prototype.test()RegExp.prototype.test()方法の論理は、最初の一致項が見つかったときにtrueに戻る.文字列全体を検索してもマッチするものが見つかりませんでした.falseを返します.
    具体的にはどうやって探しますか?ここではRegExpのもう一つの方法を見ます.
    この方法の戻り値に注意してください.
    var r = /\d/;
    //    ,        ,          ,     index   
    console.log(r.exec('123')); // ["1", index: 0, input: "123"]
    キーは、RegExp.prototype.exec()が値のexec属性を返し、この属性識別は入力テキストのどのインデックスからマッチするエントリを検索するかを開始することである.indexを追加しないと、毎回インデックス0から検索を開始します.
    var r = /\d/;
    console.log(r.exec('123')); // ["1", index: 0, input: "123"]
    console.log(r.exec('123')); // ["1", index: 0, input: "123"]
    console.log(r.exec('123')); // ["1", index: 0, input: "123"]
    gを追加したら?
    var r = /\d/g;
    console.log(r.exec('123')); // ["1", index: 0, input: "123"]
    console.log(r.exec('123')); // ["2", index: 1, input: "123"]
    console.log(r.exec('123')); // ["3", index: 2, input: "123"]
    console.log(r.exec('123')); // null
    結果から、このgは変化しています.マッチするものが見つからないと、nullに戻ります.
    まとめてみます.修繕器indexの役割は、このindexをグローバルに記憶する必要があるかどうかを識別することです.
    この理解があれば、前の問題に戻っても通じると思います.g修飾子を使用していると、前回のgが記憶されます.第二回indexを実行すると、インデックスは1であり、もちろん一致しないので、console.log(r.test('1'));に戻ります.
    その問題はまた来ました.どうして3回目にfalseに戻りましたか?
    コードを先に見ますか?
    var r = /\d/g;
    console.log(r.exec('12')); // ["1", index: 0, input: "12"]
    console.log(r.exec('12')); // ["2", index: 1, input: "12"]
    console.log(r.exec('12')); // null
    console.log(r.exec('12')); // ["1", index: 0, input: "12"]
    このtrueは、要素にマッチしないことが発見された場合、indexに再設定される.
    これは最初のコード全体を説明します.
    転載先:https://www.cnblogs.com/humin/p/6927210.html