g
正则表达式中的标志是什么意思?
/.+/g
和 和有什么不一样/.+/
?
g
用于全局搜索。这意味着它将匹配所有事件。您通常还会看到i
忽略大小写的意思。
“g”标志表示应该针对字符串中所有可能的匹配项测试正则表达式。
没有g
标志,它只会测试第一个。
Javascript中的示例来解释:
> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]
> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]
g
是全局搜索标志。
全局搜索标志使正则表达式在整个字符串中搜索模式,创建一个它可以找到与给定模式匹配的所有匹配项的数组。
/.+/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);
和之间没有区别/.+/g
,/.+/
因为它们都只会匹配整个字符串一次。如果正g
则表达式可以匹配多次或包含组,则会有所不同,在这种情况下,.match()
将返回匹配的数组而不是组的数组。
除了已经提到的g
标志的含义外,它还影响regexp.lastIndex
属性:
lastIndex 是正则表达式实例的读/写整数属性,它指定开始下一个匹配的索引。(...) 仅当正则表达式实例使用“g”标志指示全局搜索时才设置此属性。
g
->
返回所有匹配项without g
->
返回第一个匹配例子:
'1 2 1 5 6 7'.match(/\d+/)
返回["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]
。如您所见,我们只能参加第一场比赛"1"
。'1 2 1 5 6 7'.match(/\d+/g)
返回一个包含所有匹配项的数组["1", "2", "1", "5", "6", "7"]
。正则表达式中的 G 定义了全局搜索,这意味着它将搜索所有行上的所有实例。
将基于字符串给出示例。如果我们想从字符串中删除所有出现。假设我们想从“hello world”中删除所有出现的“o”和“”
"hello world".replace(/o/g,'');