我不知道为什么但是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
正则表达式的位置:
var where_regex = /where/ig
这是结果的屏幕截图,因为你可以看到它每次被调用时都会改变,但我没有改变字符串中的任何内容。我真的很感激这个解释
答案 0 :(得分:4)
这是因为/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
变量中的相同正则表达式对象),第二个匹配从第一个完成的位置开始(即 after {{ 1}})。请注意,在失败后使用w
会将其重置 - 因此匹配将从该行的开头开始。
但是在第二组语句中,每次创建一个新的正则表达式对象,并且每个(显然)分别存储最后一个匹配的位置。因此,它有四个//g.test
。
最重要的是,true
使用/g
方法非常奇怪 - 当然,除非你希望模式遍历字符串。请记住,test
会返回test
或true
(并且不捕获任何内容),因此在正常情况下,启用正则表达式全局模式至少可以说是多余的。