javalastindexof正则_浅析正则表达式中的lastIndex以及预查依次写出下列输出内容。
var reg1 = /a/;
var reg2 = /a/g;
console.st('abcabc')); // true
console.st('abcabc')); // true
console.st('abcabc')); // true
console.st('abcabc')); // true
console.st('abcabc')); // true
console.st('abcabc')); // true
console.st('abcabc')); // false
console.st('abcabc')); // true
很简单的⼀个正则表达式测试,查字符串abcabc中是否有字符a。但是结果却有⼀个特殊false存在,Why?
lastIndex(针对于带参数g的正则表达式)
在每个实例化的RegExp对象中,都存在⼀个lastIndex属性,其初始值为0。
/a/.lastIndex // 0
new RegExp('a').lastIndex // 0
lastIndex表⽰匹配成功时候,匹配内容最后⼀个字符所在原字符串中的位置 + 1,也就是匹配内容的下⼀个字符的index(如果匹配内容在字符串的结尾,同样返回原字符串中的位置 + 1,也就是字符串的length)。如果未带参数g,lastIndex始终为0。
var reg = /ab/g;
console.log(reg.lastIndex) // 5
/
/ 匹配内容在最后
var reg = /ab/g;
console.log(reg.lastIndex) // 5
// 不带参数g
var reg = /ab/;
console.log(reg.lastIndex) // 0
⽽这个lastIndex也就是⽤该正则进⾏其他匹配操作的时候匹配开始的位置。⽽匹配失败时重置lastIndex为0。
var reg = /ab/g;
// 初始值为0,从最开始匹配 匹配成功, lastIndex为4
console.st('12ab34ab'), reg.lastIndex); // true 4
// 从第4位字符"3"开始匹配 匹配内容为第⼆个ab lastIndex 为 8
console.st('12ab34ab'), reg.lastIndex); // true 8
// 从第8位 (字符长度为8,没有第8位) 开始匹配 匹配不成功 重置lastIndex 为 0
console.st('12ab34ab'), reg.lastIndex); // false 0
// 从头匹配 同第⼀步
console.st('12ab34ab'), reg.lastIndex); // true 4
看到这⾥题⽬也就解答完毕,接下来是扩展。
对于未重新声明的reg容易犯错的地⽅。
// 测试字符串str1 和 str2 是否都含有ab字符
var reg = /ab/g;
var str1 = '123ab';
var str2 = 'ab123';
console.st(str1)); // true
console.st(str2)); // false
很明显这⾥因为lastIndex的原因导致判断错误。这⾥可以修改reg不带参数g或则重新声明reg,当然也可以在第⼀次匹配后⼿动修改
reg.lastIndex = 0。
预查
接着说预查,字⾯意思就是预备匹配查询,也就是查询匹配内容接下来的内容,但是只是预备查询匹配,并不返回。
经常我们需要匹配到字符串中某些字符后⾯跟某些字符,但是我们不需要匹配结果中包含后⾯跟的字符,例如:
出下⾯字符串中字符后⾯是2的所有字符。
var str = 'a1b2c22d31e4fg6h2';
'a1b2c22d31e4fg6h2'.match(/[a-z]2/g); // ["b2", "c2", "h2"]
java中index是什么意思这样,虽然能匹配出字符串带2的,但是数字2我们并不需要,这⾥只需要字符。⽽⽤预查:
'a1b2c22d31e4fg6h2'.match(/[a-z](?=2)/g); // ["b", "c", "h"]
可以看到完全满⾜条件,但是预查和本⽂的主题lastIndex⼜有⼏⽑钱的关系呢?
我们⽤test来看看,⾄于为什么⽤test这⾥要说明⼀下,match是匹配所有,直到匹配不成功的时候结束匹配,⽽匹配不成功时,lastIndex 就被重置为0了。
⽽exec和test是第⼀次匹配成功或者匹配失败就返回,并不会接着往下匹配。
var reg1 = /[a-z](?=2)/g;
var reg2 = /[a-z]2/g;
var str = 'a1b2c22d31e4fg6h2';
console.st(str), reg1.lastIndex); // true 3
console.st(str), reg1.lastIndex); // true 5
console.st(str), reg1.lastIndex); // true 16
console.st(str), reg1.lastIndex); // false 0
console.st(str), reg2.lastIndex); // true 4
console.st(str), reg2.lastIndex); // true 6
console.st(str), reg2.lastIndex); // true 17
console.st(str), reg2.lastIndex); // false 0
看出问题没有?预查的lastIndex不包含预查内容! 这⾥就可以⽤来简化很多判断了。
例如我们要匹配密码必须有⾄少⼀个⼤写字母,⼀个⼩写字母,⼀个数字,并且长度⾄少6位⽽且只能是数字字母组合。
按照不会预查的情况会这样去判断:
/[a-z]/.test(pwd) && /[A-Z]/.test(pwd) && /\d/.test(pwd) && /^[a-zA-Z0-9]{6,}$/.test(pwd);
但是:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z0-9]{6,}$/.test(pwd)
分解出来看:
(?=.*[a-z]) 是否有⼩写字母 但是是预查 匹配失败返回false 成功lastIndex不变动,还是为0,同理理解两外预查内容,最后就是6喂以上的字母数字组合匹配,但是前⾯都是预查,lastIndex始终未0,每次匹配都是从最开始匹配的,所以满⾜要求。
以上所述是⼩编给⼤家介绍的浅析正则表达式中的lastIndex以及预查,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对脚本之家⽹站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论