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

IT技术 javascript regex
2021-01-23 11:16:18

g正则表达式中的标志是什么意思

什么是之间的区别/.+/g/.+/

6个回答

g用于全局搜索。这意味着它将匹配所有出现的事件。您通常还会看到i这意味着忽略大小写。

参考:全局 - JavaScript | MDN

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

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

所以在使用 .test 函数时 /g 标志是无关紧要的,因为它无论如何只能找到第一个匹配项,对吧?
2021-04-03 11:16:18
@xr280xr 并非无关紧要,更像是适得其反。如果您重新使用 RegExp,它会破坏事情。var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
2021-04-08 11:16:18

Javascript中的例子来解释:

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

> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]
谢谢。我不确定 Javascript 中的正则表达式是否可以像在 PHP 中那样返回一个数组,这证实了这一点。
2021-04-10 11:16:18

g 是全局搜索标志。

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

所以之间的差异 /.+/g,并/.+/ 是该g版本会发现每一次出现,而不只是第一个。

正如@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);

在这个错误上花了 3 个小时后,我偶然发现了这个答案。我使用了/g跳过很少出现的模式的标志,因为它总是向前移动。你救了我的一天。谢谢!
2021-03-25 11:16:18

/.+/g之间没有区别/.+/因为它们都只会匹配整个字符串一次。g有差别如果正则表达式可以匹配多于一次或含有基团,在这种情况下.match()将返回匹配的数组代替组的阵列。