ES11 - 匹配全局的正则表达式

正则表达式在前端开发中是一个非常有用的工具,它可以用来检查和匹配字符串。在ES11中,有一个新的特性,就是可以全局匹配正则表达式了。这个特性可以让我们更方便地处理字符串,提高代码效率。

全局匹配正则表达式

在ES11中,新增了一个global属性,可以用来匹配全局的正则表达式。对于一个正则表达式,使用global属性可以在整个字符串中进行匹配,而不仅仅是第一个匹配到的字符。

const str = "Hello World, Hello JavaScript";
const regex = /Hello/g;

const matches = str.match(regex);
console.log(matches); // ['Hello', 'Hello']

在上面的代码中,我们使用/Hello/g来创建一个正则表达式,并使用全局匹配的方式找到了所有的Hello字符串。

全局匹配的注意事项

需要注意的是,在全局匹配时,我们不能使用^$来匹配字符串的开始和结束:

const str = "Hello World, Hello JavaScript";
const regex = /^Hello/g;

const matches = str.match(regex);
console.log(matches); // null

在上面的代码中,我们尝试使用/^Hello/g来匹配开头为Hello的字符串,但是结果返回为null,因为全局匹配不能找到字符串的开始。

另外一个需要注意的点是,全局匹配会改变正则表达式的lastIndex属性。如果我们连续执行多次匹配,lastIndex的值会发生变化,导致匹配不准确。

const regex = /Hello/g;

console.log(regex.lastIndex); // 0

console.log(regex.exec("Hello World")); // ["Hello"]
console.log(regex.lastIndex); // 5

console.log(regex.exec("Hello JavaScript")); // ["Hello"]
console.log(regex.lastIndex); // 11

在上面的代码中,我们先定义了一个正则表达式/Hello/g,然后执行了两次匹配。在第一次匹配后,lastIndex变为了5,导致第二次匹配时只能从第5个字符开始匹配。

为了解决这个问题,我们需要在每次执行匹配之前,将lastIndex属性重置为0。

const regex = /Hello/g;

console.log(regex.lastIndex); // 0

console.log(regex.exec("Hello World")); // ["Hello"]
console.log(regex.lastIndex); // 5

regex.lastIndex = 0;

console.log(regex.exec("Hello JavaScript")); // ["Hello"]
console.log(regex.lastIndex); // 5

在上面的代码中,我们在第一次匹配后重新设置了lastIndex属性为0,这样第二次匹配就能从字符串开头匹配了。

总结

ES11中新增的全局匹配正则表达式的特性,可以帮助我们更方便地处理字符串。但是需要注意在全局匹配时不能使用^$来匹配字符串的开始和结束,以及重置lastIndex属性避免匹配不准确的问题。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a3a2daadd4f0e0ffbc5c82


纠错反馈