今回は、正規表現での 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
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
事前チェック
次に、事前チェックについて話しましょう。これは文字通り、一致するクエリを準備すること、つまり、一致するコンテンツの次のコンテンツをクエリすることを意味しますが、一致するクエリを準備するだけであり、戻りません。 多くの場合、文字列内の特定の文字とその後に続く特定の文字を一致させる必要がありますが、一致結果に次の文字を含める必要はありません。 例: 以下の文字列の後に 2 が続く文字をすべて検索します。 。var str = 'a1b2c22d31e4fg6h2'; 'a1b2c22d31e4fg6h2'.match(/[a-z]2/g); // ["b2", "c2", "h2"]
'a1b2c22d31e4fg6h2'.match(/[a-z](?=2)/g); // ["b", "c", "h"]
うーん
問題が分かりましたか?事前チェックされた 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);
通常の複数行モードと単一行モードの使用についての詳細な図による説明
PHP に基づく通常のゼロ幅アサーションの使用についての詳細な説明
以上が正規表現での lastIndex の使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。