Chrome开发工具正则表达式测试每次调用时返回不同的结果

时间:2012-11-02 13:14:16

标签: javascript regex

我不知道为什么但是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

这是结果的屏幕截图,因为你可以看到它每次被调用时都会改变,但我没有改变字符串中的任何内容。我真的很感激这个解释

enter image description here

1 个答案:

答案 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会返回testtrue(并且不捕获任何内容),因此在正常情况下,启用正则表达式全局模式至少可以说是多余的。