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


110

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

/.+/g和之间有什么区别/.+/

Answers:


130

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

参考:全局-JavaScript | MDN

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

没有g标志,它将仅测试第一个。


1
因此/ g标志在使用.test函数时是无关紧要的,因为它始终只能找到第一个匹配项,对吗?
xr280xr

10
@ xr280xr无关紧要,更像适得其反。如果您重新使用RegExp,它将破坏一切。var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch '18


41

用JavaScript举例说明:

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

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

10

g 是全局搜索标志。

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

因此,/.+/g和之间的区别在于 /.+/ ,该g版本将找到所有匹配项,而不仅仅是第一次匹配。


9

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


8

正如@matiska指出的那样,该g标志lastIndex也会设置该属性。

这样做的一个非常重要的副作用是,如果您对匹配的字符串重复使用同一个regex实例,则该实例最终将失败,因为它仅在处开始搜索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);


6

除了已经提到的g标志的含义,它还会影响regexp.lastIndex属性:

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

参考:Mozilla开发人员网络


3

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


1

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

"hello world".replace(/o/g,'');

0
  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"]

1
请进一步说明-“所有匹配”和“首次匹配”之间有什么区别?
Nico Haase

我解释了更多。感谢您的指导
Nagibaba

@NicoHaase您能否删除您的否定率?我试图做出更多解释。
Nagibaba

抱歉误会了:)
Nagibaba
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.