ホームページ  >  記事  >  ウェブフロントエンド  >  正規表現での lastIndex の使用方法の詳細な説明

正規表現での lastIndex の使用方法の詳細な説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-03-29 16:20:122087ブラウズ

今回は、正規表現での lastIndex の使用について詳しく説明します。正規表現で lastIndex を使用する場合の 注意事項 は何ですか?実際のケースを見てみましょう。

以下の出力内容を順番に書きます。

var reg1 = /a/;
var reg2 = /a/g;
console.log(reg1.test('abcabc')); // true
console.log(reg1.test('abcabc')); // true
console.log(reg1.test('abcabc')); // true
console.log(reg1.test('abcabc')); // true
console.log(reg2.test('abcabc')); // true
console.log(reg2.test('abcabc')); // true
console.log(reg2.test('abcabc')); // false
console.log(reg2.test('abcabc')); // true

stringabcabc に文字 a があるかどうかを調べる非常に簡単な 正規表現テスト。しかし、結果には特別な誤りがあります。なぜですか?

lastIndex (パラメーター g を持つ正規表現用)

インスタンス化されたすべての

RegExp オブジェクトには、初期値 0 の lastIndex 属性があります。

/a/.lastIndex // 0
new RegExp('a').lastIndex // 0
lastIndex表示匹配成功时候,匹配内容最后一个字符所在原字符串中的位置 + 1,也就是匹配内容的下一个字符的index(如果匹配内容在字符串的结尾,同样返回原字符串中的位置 + 1,也就是字符串的length)。如果未带参数g,lastIndex始终为0。
var reg = /ab/g;
reg.test('123abc');
console.log(reg.lastIndex) // 5
// 匹配内容在最后
var reg = /ab/g;
reg.test('123ab');
console.log(reg.lastIndex) // 5
// 不带参数g
var reg = /ab/;
reg.test('123abc');
console.log(reg.lastIndex) // 0
そして、この lastIndex は、この通常のルールを使用して他のマッチング操作を実行するときのマッチングの開始位置です。一致が失敗すると、lastIndex は 0 にリセットされます。

var reg = /ab/g;
// 初始值为0,从最开始匹配 匹配成功, lastIndex为4
console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4
// 从第4位字符"3"开始匹配 匹配内容为第二个ab lastIndex 为 8
console.log(reg.test('12ab34ab'), reg.lastIndex); // true 8
// 从第8位 (字符长度为8,没有第8位) 开始匹配 匹配不成功 重置lastIndex 为 0
console.log(reg.test('12ab34ab'), reg.lastIndex); // false 0
// 从头匹配 同第一步
console.log(reg.test('12ab34ab'), reg.lastIndex); // true 4
これを見た後、質問は解決されました。次のステップは拡張です。

再宣言されていない登録は間違いを犯しやすいです。

// 测试字符串str1 和 str2 是否都含有ab字符
var reg = /ab/g;
var str1 = '123ab';
var str2 = 'ab123';
console.log(reg.test(str1)); // true
console.log(reg.test(str2)); // false
明らかにlastIndexによる判断ミスがあります。ここでは、パラメータ g を指定せずに reg を変更したり、reg を再宣言したりできます。もちろん、最初の一致の後で reg.lastIndex = 0 を手動で変更することもできます。

事前チェック

次に、事前チェックについて話しましょう。これは文字通り、一致するクエリを準備すること、つまり、一致するコンテンツの次のコンテンツをクエリすることを意味しますが、一致するクエリを準備するだけであり、戻りません。

多くの場合、文字列内の特定の文字とその後に続く特定の文字を一致させる必要がありますが、一致結果に次の文字を含める必要はありません。 例:

以下の文字列の後に 2 が続く文字をすべて検索します。 。

var str = 'a1b2c22d31e4fg6h2';
'a1b2c22d31e4fg6h2'.match(/[a-z]2/g); // ["b2", "c2", "h2"]
このように、2 を含む文字列は一致しますが、数字の 2 は必要ありません。ここでは文字だけが必要です。事前チェック:

'a1b2c22d31e4fg6h2'.match(/[a-z](?=2)/g); // ["b", "c", "h"]
を使用すると、条件が完全に満たされていることがわかりますが、事前チェックはこの記事の主題である lastIndex とどの程度関係があるのでしょうか?

テストを使用する理由については、ここで説明する必要があります。一致が失敗すると、lastIndex は 0 にリセットされます。

Exec と test は、最初の一致が成功した場合、または一致が失敗した場合に返され、引き続き一致することはありません。

うーん

問題が分かりましたか?事前チェックされた lastIndex には、事前チェックされたコンテンツが含まれていません。 これを使用すると、多くの判断を簡素化できます。

たとえば、パスワードを一致させたい場合は、少なくとも 1 つの大文字、1 つの小文字、1 つの数字が必要で、長さは 6 文字以上で、数字と文字の組み合わせのみにする必要があります。

事前確認なしで状況に応じて次のように判断されます:

var reg1 = /[a-z](?=2)/g;
var reg2 = /[a-z]2/g;
var str = 'a1b2c22d31e4fg6h2';
console.log(reg1.test(str), reg1.lastIndex); // true 3
console.log(reg1.test(str), reg1.lastIndex); // true 5
console.log(reg1.test(str), reg1.lastIndex); // true 16
console.log(reg1.test(str), reg1.lastIndex); // false 0
console.log(reg2.test(str), reg2.lastIndex); // true 4
console.log(reg2.test(str), reg2.lastIndex); // true 6
console.log(reg2.test(str), reg2.lastIndex); // true 17
console.log(reg2.test(str), reg2.lastIndex); // false 0
しかし:

/[a-z]/.test(pwd) && /[A-Z]/.test(pwd) && /\d/.test(pwd) && /^[a-zA-Z0-9]{6,}$/.test(pwd);
分解して見てください:

(?=.*[a-z]) 小文字があるかどうか、一致の事前チェックは失敗し、正常に false を返します。lastIndex は変更されず、0 のままです。同様に、2 つの外部ソースの事前チェックの内容が理解されます。最後のものは、6 を超える英数字の組み合わせの一致です。ただし、以前のものは事前チェックであり、lastIndex は常に 0 ではありません。各一致は最初から一致するため、要件は満たされます。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

通常の複数行モードと単一行モードの使用についての詳細な図による説明

PHP に基づく通常のゼロ幅アサーションの使用についての詳細な説明

以上が正規表現での lastIndex の使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。