关于使用数组的高阶函数进行正则表达式全局搜索的问题


let phoneNums = ["801-766-9754", "801-545-5454", "435-666-1212", "801-796-8010", "435-555-9801", "801-009-0909", "435-222-8013", "801-777-66553", "801-777-665-", "801-77A-6655", "801-778-665"];
let regEx = /801-/g, 
newArray = []
newArray = phoneNums.map(elem => regEx.test(elem));
console.log(newArray);

井。。。问题是为什么在启用全局搜索时,我们没有得到想要的结果。预期结果应该是

​[ true, true, false, true, false, true, false, true, true, true, true]

但是启用全局搜索或 g 标志后,结果是

[ true, false, false, true, false, true, false, true, false, true, … ]

所以我只是想知道为什么会这样?

这是因为 JavaScript 正则表达式是有状态的

当您调用test时,它会更改正则表达式的状态(将其推进到匹配的末尾)。当您第二次调用它时(在数组的下一个元素上),它会尝试从上一个匹配的末尾开始搜索。它会导致 false,因为在第一个匹配项之后没有更多的匹配项。

这可以通过以下简单的代码来演示:

let phoneNum = "801-545-5454";
let regEx = /801-/g;
console.log(regEx.test(phoneNum));
console.log(regEx.test(phoneNum));

一种方法是不将正则表达式保存到变量中:

let phoneNums = ["801-766-9754", "801-545-5454", "435-666-1212", "801-796-8010", "435-555-9801", "801-009-0909", "435-222-8013", "801-777-66553", "801-777-665-", "801-77A-6655", "801-778-665"];
let newArray = phoneNums.map(elem => /801-/g.test(elem));
console.log(newArray);

另请注意,由于您只是测试字符串是否与正则表达式匹配,因此不需要g修饰符,因为字符串匹配一次还是 100 次并不重要。

最新更新