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

int*_*lis 95 javascript regex

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

有什么区别/.+/g/.+/

sac*_*een 112

g用于全球搜索.这意味着它将匹配所有出现.你通常也会看到i哪些方法忽略了大小写.

参考:global - JavaScript | MDN

"g"标志表示应该针对字符串中的所有可能匹配来测试正则表达式.

没有g旗帜,它只会测试第一个.

  • @ xr280xr不相关,更像是适得其反.如果您重新使用RegExp,它将会破坏它.`var r =/a/g; console.log(r.test('a'),r.test('a')); //真假 (8认同)
  • 因此,在使用 .test 函数时, /g 标志是无关紧要的,因为它只能找到第一个匹配项,对吗? (3认同)

Luk*_*e W 33

Javascript中的示例解释:

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

> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]
Run Code Online (Sandbox Code Playgroud)


dav*_*ler 11

g 是全球搜索标志.

全局搜索标志使RegExp在整个字符串中搜索模式,创建一个可以找到与给定模式匹配的所有实例的数组.

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


Nag*_*aba 10

  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'.match(/\d+/g)返回所有匹配项的数组["1", "2", "1", "5", "6", "7"]


Nei*_*eil 9

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


cch*_*ain 7

正如@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);
Run Code Online (Sandbox Code Playgroud)

  • 在花了 3 个小时研究这个 bug 后,我偶然发现了这个答案。我使用了“/g”标志,它跳过了几次出现的模式,因为它总是向前移动。你救了我的命。谢谢! (3认同)

mat*_*ska 6

除了已经提到的gflag的含义之外,它还会影响regexp.lastIndex属性:

lastIndex是正则表达式实例的读/写整数属性,指定开始下一个匹配的索引.(...)仅当正则表达式实例使用"g"标志指示全局搜索时才设置此属性.

参考:Mozilla开发者网络