正则表达式中“ g”标志的含义是什么?

g标志在正则表达式中的含义是什么?

/.+/g/.+/的区别是什么?

135202 次浏览

g是全局搜索标志。

全局搜索标志使 RegExp 在整个字符串中搜索一个模式,创建一个它能找到的所有匹配给定模式的匹配项的数组。

所以 /.+/g/.+/的不同之处在于,g版本会找到每一个出现的事件,而不仅仅是第一个。

g是全局搜索。意思是它会匹配所有的匹配项。你通常也会看到 i,意思是忽略大小写。

参考资料: Global-JavaScript | MDN

“ g”标志表示应该针对字符串中的所有可能匹配对正则表达式进行测试。

没有 g标志,它只会测试第一个。

此外,请确保检查 张伯伦的回答如下以获得有关如何设置 lastIndex属性的详细信息,这在对一系列值重用正则表达式时可能会导致意外的副作用。

/.+/g/.+/之间没有区别,因为它们都只匹配整个字符串一次。如果正则表达式可以匹配不止一个或包含多个组,那么 g就会有所不同,在这种情况下,.match()将返回匹配项的数组,而不是组的数组。

正则表达式中的 G 是一个定义全局搜索,这意味着它将搜索所有行上的所有实例。

Javascript 中的示例来解释:

> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]


> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]

除了上面提到的 g标志的含义外,它还影响 regexp.lastIndex的属性:

LastIndex 是正则表达式的读/写整数属性 实例,该实例指定开始下一次匹配的索引。 (...)仅当正则表达式实例 使用“ g”标志表示全局搜索。

参考资料: Mozilla Developer Network

正如@matiska 指出的,g标志也设置了 lastIndex属性。

这样做的一个非常重要的副作用是,如果对匹配的字符串重用相同的正则表达式实例,它最终将失败,因为它只在 lastIndex处开始搜索。

// regular regex
const regex = /foo/;


// same regex with global flag
const regexG = /foo/g;


const str = " foo foo foo ";


const test = (r) => console.log(
r,
r.lastIndex,
r.test(str),
r.lastIndex
);


// Test the normal one 4 times (success)
test(regex);
test(regex);
test(regex);
test(regex);


// Test the global one 4 times
// (3 passes and a fail)
test(regexG);
test(regexG);
test(regexG);
test(regexG);

将给出基于字符串的示例 绳子。 假设我们要从 hello world 中删除所有“ o”和“ o”的出现

"hello world".replace(/o/g,'');
  1. g ->返回所有匹配项
  2. without g ->返回第一个匹配

例如:

  1. '1 2 1 5 6 7'.match(/\d+/)返回 ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]。正如你所看到的,我们只能采取第一个匹配 "1"
  2. 返回所有匹配 ["1", "2", "1", "5", "6", "7"]的数组。