あなたは本当に正則修羅符を理解しますか?
3969 ワード
0、はじめに
一部のコードによる思考:
1、正則修飾子
正則は各言語において、実現の基準は完全に一致していない.ここでは
それらの意味は以下の通りです. global(g)は、文字列内のすべての可能な一致について正規表現 をテストする. ignoreCase(i)マッチング時に、大文字小文字 を無視する. multiiline(m)マルチライン入力は、複数行と見なされる(このとき開始^と終端が一致する$各行にマッチすることができる) unicode(u)は文字列にunicodeを採用してマッチングします.
修飾子:
2、正則修飾子:
まず最初のコードに戻ります.大体の人の答えは
実際、正解は
RegExp.prototype.test()
具体的にはどうやって探しますか?ここでは
この方法の戻り値に注意してください.
まとめてみます.修繕器
この理解があれば、前の問題に戻っても通じると思います.
その問題はまた来ました.どうして3回目に
コードを先に見ますか?
これは最初のコード全体を説明します.
転載先:https://www.cnblogs.com/humin/p/6927210.html
一部のコードによる思考:
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を参照してください.それらの意味は以下の通りです.
修飾子:
i
i
は分かりやすいです.マッチング時に、大文字と小文字は無視されます.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