正则表达式 ,test()慎重全局查找/…/g属性
先看下最开始的代码
eg:
var reg = /\./g;
var balance = '100';
reg.test(balance) ? balance : balance += '.00';
是因为在接收到后台数据,由于第一次,再测试数据中,后台给的全是整数,所以我加g进行判断,全部正确,并没有发现错误;
eg:
var reg = /\./g;
var balance = '0.2';
reg.test(balance) ? balance : balance += '.00';
第二次后台给的数据,是包含小数的,错误就出现了
结果显示的是
0.2
0.2.00
........//循环上面两次结果
原因就是因为reg=/\./g
正则表达式里加入了g全局查找。
具体原因论坛里有人已经分析过了,我就不详细说明了,贴上别人的连接[http://blog.youkuaiyun.com/leolu007/article/details/8576490)]
但是,我想就我这次错误总结一下我的理解,希望我的理解能帮助到你。
加上全局g.会导致下一次的判断,会根据上一次的位置查找,不论reg.test() 括号里内容是否变化,
例如:
var reg=/\./g
reg.test(0.2)//true
reg.test(0.2)//false,因为接着上一次的index位置查找,没找到正则中的内容,所以是false,false以后,index会自动归0
reg.test(0.2)//true
reg.test(123.4)//false 注意,此时已经换了验证内容,但依然会是false
写到这里,不知道各位有没有点想法,这是我发现论坛里有没写到的地方,可能也许是还没找到写过人的帖子。。。。。
就是验证内容不管相同不相同,结果都是一次true,一次false
所以我想到了reg加g全局验证下,记录的index位置,是根据正则规则来定的,举个例子说明
var reg=/\./g;
var ret=/\./g;
reg.test(0.2)//true
ret.test(0.2)//true;
所以,加g全局判断下,index的记录位置,是根据正则表达式来定的,不同表达式,初始位置都是0,即使验证同一段信息,不同正则表达式,再全局属性下,第一次验证结果也都是true。
发现了没有,所以index是和正则表达式规则息息相关的,和验证内容是没关系的。
当然,用同一正则表达式判断不同内容,还是要慎用g。我只是把自己理解到的,论坛里可能没人提到的写下来,对我自己也是个提醒。希望可以帮助大家。