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

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

这是结果的截图,可以看到每次调用时都会改变,但字符串中没有做任何更改。能否给出一个解释,谢谢。

有人能解释一下什么是“踩”吗? - user225269
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
底线是,使用/gtest方法相当奇怪 - 除非您想要模式在字符串上移动。请记住,test返回truefalse(不捕获任何内容),因此在正常情况下启用正则表达式全局模式是多余的,至少可以这么说。

那么有没有一种方法可以重复使用正则表达式对象来调用测试?是否有一种方法/属性可以触发“重置”?我的用例:对于数组中的每个字符串,检查它是否仅由空格字符(可以是多行)组成。 - Dmitry Pashkevich
我不确定是否理解正确,但是只需检查每个字符串是否存在 /\S/ 而无需使用全局标志如何? - raina77ow
抱歉,是我自己的问题,一开始没有意识到只需要去掉全局标志。谢谢! - Dmitry Pashkevich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接