当我使用全局标志和不区分大小写的标志时,此正则表达式有什么问题?查询是用户生成的输入。结果应该是[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/41533777/

10-09 15:20