var reg = /^(https|http)?:\/\//g;
str = "https://www.baidu.com";
reg.test(str);
这个正则我是用来测试str是否是http://或https://开头,但蛋疼的事发生了,reg.test(str)每次返回的结果是不一样的,一次true一次false,简直颠覆我三观。
有图为证:
然后网上查了下,把g去了就好。可这就让我疑惑了,g只是全局匹配,在这怎么会影响结果呢,而且为什么是一次true一次false呢。
var reg = /^(https|http)?:\/\//g;
str = "https://www.baidu.com";
reg.test(str);
这个正则我是用来测试str是否是http://或https://开头,但蛋疼的事发生了,reg.test(str)每次返回的结果是不一样的,一次true一次false,简直颠覆我三观。
有图为证:
然后网上查了下,把g去了就好。可这就让我疑惑了,g只是全局匹配,在这怎么会影响结果呢,而且为什么是一次true一次false呢。
谢邀!
var reg = /^(https|http):\/\//g;
var str = "https://www.baidu.comhttps://www.baidu.com";
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
以上是群主的true和false切换的代码,打印结果可以看到起始索引是在0,8之间切换。
为什么不是每次从0开始呢?不错,就是这个/g引起的。
若不加/g,则只返回第一个匹配,无论执行多少次均是如此;
若加入/g,则第一次返回第一个匹配,第二次返回第二个匹配,依次类推。
上述解释按理来说,应该是0,8,29...,可为什么是0,8呢?看看下面这段代码:
var reg = /(https|http):\/\//g;
var str = "https://www.baidu.comhttps://www.baidu.com";
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
console.log( reg.lastIndex, reg.test(str));
是的,就是reg里^这个是起始标志在作怪了,第二次已经匹配不到了,索引置0。
其实,在测试是否存在这种功能里,/g是没啥意义的,解决方法有两种:
去掉/g
索引重置
var reg = /(https|http):\/\//g;
var str = "https://www.baidu.comhttps://www.baidu.com";
reg.lastIndex=0
console.log(reg.test(str));
reg.lastIndex=0
console.log(reg.test(str));
reg.lastIndex=0
console.log(reg.test(str));
reg.lastIndex=0
console.log(reg.test(str));
reg.lastIndex=0
console.log(reg.test(str));
reg.lastIndex=0
console.log(reg.test(str));
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
test 是有状态的
http://stackoverflow.com/ques...