📅  最后修改于: 2023-12-03 15:16:08.726000             🧑  作者: Mango
正则表达式是一种强大的字符串匹配工具。JavaScript 中的正则表达式可以使用 RegExp
类来创建。g
修饰符可以让正则表达式在匹配到第一个结果后继续查找下一个结果。
在创建正则表达式时通过添加 g
修饰符来使其具备全局搜索的能力。例如:
const regex = /foo/g;
当执行正则表达式搜索时,如果只返回第一个匹配到的结果,那么没有添加 g
修饰符与添加 g
修饰符是没有差别的:
const text = 'foo bar foo baz';
console.log(text.match(/foo/)); // ['foo']
console.log(text.match(/foo/g)); // ['foo', 'foo']
上面的代码中,match
方法会查找字符串中所有符合正则表达式规则的部分。
我们可以利用正则表达式的全局匹配能力来替换文本中所有的指定字符串。例如,我们可以将所有的 "foo"
替换成 "bar"
:
const text = 'foo bar foo baz';
const result = text.replace(/foo/g, 'bar');
console.log(result); // 'bar bar bar baz'
在使用 g
修饰符时需要注意一些问题。因为正则表达式会在全局搜索中保持其状态,所以如果多次使用同一个正则表达式对象,就有可能会遇到出人意料的结果。
例如,下面的代码块展示了在没有使用 g
修饰符时的正常行为,以及通过重用正则表达式对象对结果造成干扰的情况:
const text = 'foo bar foo baz';
const regex = /foo/;
console.log(text.match(regex)); // ['foo']
console.log(text.match(regex)); // ['foo']
regex.lastIndex = 0; // 重置正则表达式状态
console.log(text.match(regex)); // ['foo']
在第四行代码块中,我们将 lastIndex
属性设置为 0
来重置正则表达式的状态,从而确保 match
方法从头开始搜索字符串。
但是在下面的代码块中,我们会发现即使是重置了状态,之前存在的状态仍然会对正则表达式产生影响。
const text = 'foo bar foo baz';
const regex = /foo/g;
console.log(text.match(regex)); // ['foo', 'foo']
console.log(text.match(regex)); // null
regex.lastIndex = 0; // 重置正则表达式状态
console.log(text.match(regex)); // ['foo', 'foo']
在第四行和第九行代码块中,我们都将 lastIndex
属性设置为 0
。但是在第六行中,match
方法因为正则表达式的全局搜索状态而返回了 null,而不是一个字符串数组。
因此,如果你需要多次使用同一个正则表达式,最好将其使用方法放在函数中,并避免重用正则表达式对象。