为什么“pattern.test(name)”连续调用的结果是相反的?
Why `pattern.test(name)` opposite results on consecutive calls
为什么这段代码先返回真,然后返回假
var pattern = new RegExp("mstea", 'gi'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
演示:小提琴
g
用于重复搜索。它将正则表达式对象更改为迭代器。如果您想使用test
函数根据模式检查字符串是否有效,请删除此修饰符:
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
与replace
或match
相反,test
函数不消耗整个迭代,这使其处于"坏"状态。在使用test
函数时,可能永远不应该使用这个修饰符。
不要将gi与pattern.test结合使用。g标志意味着它跟踪您正在运行的位置,以便可以重用它。因此,您应该使用:
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
console.log('1', pattern.test(name));
console.log('1', pattern.test(name));
也可以用/…/[flags] regex的语法,像这样:
var pattern = /mstea/i;
因为你设置了g
修饰符
为您的案例删除它。
var pattern = new RegExp("mstea", 'i'), name = "Amanda Olmstead";
它不是一个错误。
g
使它在第一次匹配之后对子字符串执行下一次尝试匹配。这就是为什么它在每一次偶数尝试中返回false。
First attempt:
It is testing "Amanda Olmstead"
Second attempt:
It is testing "d" //match found in previous attempt (performs substring there)
Third attempt:
It is testing "Amanda Olmstead" again //no match found in previous attempt
... so on
Regexp.exec
状态的MDN页面:
如果你的正则表达式使用"g"标志,你可以使用exec方法多次查找同一字符串中的连续匹配项。指定str的子字符串开始搜索正则表达式的lastIndex属性
test
状态的MDN页面:
与exec(或与其组合)一样,多次调用test对于相同的全局正则表达式实例,将向前推进到之前的比赛。
相关文章:
- webpack代码拆分了handlerbs文件——结果是文件很大
- 试图将onChange函数作为道具传递给GrandChlidren,结果是TypeError:这是未定义的
- 为什么_self结果是不同的价值观
- 如果 JS 中的函数是一流的,那么在定义它们之前允许调用它们是什么
- 为什么结果是全局名称,这是由“这个”引起的
- 斐波那契数列的结果是无穷大,然后是 NaN
- 如何处理'00'JSON中的结果是JS或Coldfusion
- 我们如何在jQuery Datatable调用结果中启动另一个jQuery插件,而不是页面就绪函数
- ReactJS-这个状态中的数组在删除时被正确更新,但结果是't,直到以后的状态发生变化
- 在JavaScript中,从主线程和回调中调用函数是一种好的风格吗
- 为什么这个JavaScript代码的结果是“;未定义”;
- 基准测试js的结果是什么意思
- 当用户移动到其他页面时,如何显示AJAX调用结果
- JSON对变量的调用结果
- 事件侦听器不会在IE中被调用 - 这是怎么回事
- 将函数从 obj 传递到数组中.然后添加数组,但结果是 NaN.为什么
- 咖啡脚本化的 ajax 调用结果在实际成功时失败回调
- 为什么在这里再次调用新是有效的
- Javascript:在对象调用中使用由两个表单字段值串联而成的变量作为属性,结果是未定义的
- 为什么“pattern.test(name)”连续调用的结果是相反的?