当我使用全局标志和不区分大小写的标志时,此正则表达式有什么问题?查询是用户生成的输入。结果应该是[true,true]。
var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
// result will be [true, false]
var reg = /^a$/g;
for(i = 0; i++ < 10;)
console.log(reg.test("a"));
最佳答案
RegExp
对象会跟踪发生匹配的lastIndex
,因此在后续匹配中,它将从上次使用的索引开始,而不是0。
var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
alert(re.lastIndex);
result.push(re.test('Foo Bar'));
如果您不想在每次测试后将
lastIndex
手动重置为0,只需删除g
标志即可。这是规范规定的算法(第15.10.6.2节):
RegExp.prototype.exec(字符串)
施行
字符串的正则表达式匹配
反对正则表达式和
返回一个包含
匹配结果;如果
字符串不匹配字符串
在ToString(string)中搜索
正则表达式的出现
模式如下:
令S为ToString(string)的值。
令length为S的长度。
令lastIndex为lastIndex属性的值。
令我为ToInteger(lastIndex)的值。
如果全局属性为false,则让i = 0。
如果I length,则将lastIndex设置为0并返回null。
调用[[Match]],为其指定参数S和i。如果[[匹配]]
返回失败,执行步骤8;
否则让r为状态结果
并转到步骤10。
令i = i + 1。
转到步骤6。
令e为r的endIndex值。
如果global属性为true,则将lastIndex设置为e。
令n为r的捕获数组的长度。 (这是相同的
值是15.10.2.1的
NCapturingParens。)
返回具有以下属性的新数组:
指标
属性设置为
完整的匹配子字符串
字符串S.
设置输入属性
到S。
length属性设置为
n + 1。
0属性设置为
匹配的子字符串(即
偏移量i(含)与之间的S
偏移量e排除)。
对于每个
整数i使得I> 0且I≤n,
将名为ToString(i)的属性设置为
r的捕获数组的第i个元素。
关于javascript - 为什么带有全局标志的RegExp给出错误的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45860969/