全局标志的正则表达式为何会导致错误的输出?
P粉282627613
P粉282627613 2023-08-22 19:11:39
0
2
441
<p>当我使用全局标志和不区分大小写标志时,这个正则表达式有什么问题?查询是用户生成的输入。结果应该是[true, true]。</p> <pre class="brush:php;toolbar:false;">var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); result.push(re.test('Foo Bar')); // 结果将是[true, false]</pre> <hr> <p> <pre class="snippet-code-js lang-js prettyprint-override"><code>var reg = /^a$/g; for(i = 0; i++ < 10;) console.log(reg.test("a"));</code></pre> </p>
P粉282627613
P粉282627613

全部回复(2)
P粉399090746

您正在使用一个RegExp对象,并且多次执行它。在每次执行时,它都会从上次匹配的索引继续。

在每次执行之前,您需要“重置”正则表达式以从头开始:

result.push(re.test('Foo Bar'));
re.lastIndex = 0;
result.push(re.test('Foo Bar'));
// 现在的结果是 [true, true]

话虽如此,每次创建一个新的RegExp对象可能更易读(开销很小,因为RegExp已经被缓存):

result.push((/Foo B/gi).test(stringA));
result.push((/Foo B/gi).test(stringB));
P粉523335026

使用带有 g 标志的 RegExp 对象会跟踪匹配发生的 lastIndex,因此在后续的匹配中,它将从上次使用的索引开始,而不是从 0 开始。看一下示例:

var query = 'Foo B';
var re = new RegExp(query, 'gi');
console.log(re.lastIndex);

console.log(re.test('Foo Bar'));
console.log(re.lastIndex);

console.log(re.test('Foo Bar'));
console.log(re.lastIndex);
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!