3

我不知道为什么,但 Chrome 开发工具正则表达式测试每次调用都会返回不同的结果。我将此作为要测试的字符串:

SELECT tbl_school.id AS tbl_school_id, school, tbl_students.id AS tbl_students_id, name, hobby, school_id, course_id FROM tbl_school, tbl_students WHERE tbl_school.id = 's' dd
ORDER BY tbl_school.id ASC

where 正则表达式是:

var where_regex = /where/ig

这是结果的屏幕截图,您可以看到它每次调用时都会发生变化,但我没有更改字符串中的任何内容。我真的很感激对此的解释

在此处输入图像描述

4

1 回答 1

5

这是因为/g标志和使用相同的正则表达式对象的事实。引用文档 ( MDN )

exec(或与之结合)一样,test在同一个全局正则表达式实例上多次调用将超过前一个匹配项。

考虑一下:

var r = /w/g;
console.log( r.test('Awa') ); // true
console.log( r.test('Awa') ); // false
console.log( r.test('Awa') ); // true
console.log( r.test('Awa') ); // false

console.log( /w/ig.test('Awa') ); // true
console.log( /w/ig.test('Awa') ); // true
console.log( /w/ig.test('Awa') ); // true
console.log( /w/ig.test('Awa') ); // true

在第一组语句中(使用存储在r变量中的相同正则表达式对象),第二个匹配从第一个匹配完成的地方开始(即,之后 w)。请注意,//g.test在失败后使用将重置它 - 因此匹配将从该行的开头开始。

但是在第二组语句中,每次创建一个新的正则表达式对象时,其中的每一个(显然)都分别存储了最后一次匹配的位置。因此,true那里有四个。

最重要的是,使用/gwithtest方法非常……很奇怪——当然,除非你想让模式越过字符串。请记住,test返回truefalse(并且不捕获任何内容),因此在正常情况下启用正则表达式全局模式是多余的,至少可以这么说。

于 2012-11-02T13:20:55.987 回答