【发布时间】:2012-10-20 23:36:10
【问题描述】:
正则表达式中g标志的含义是什么?
/.+/g 和 /.+/ 有什么区别?
【问题讨论】:
标签: javascript regex
正则表达式中g标志的含义是什么?
/.+/g 和 /.+/ 有什么区别?
【问题讨论】:
标签: javascript regex
g 用于全局搜索。这意味着它将匹配所有事件。您通常还会看到i,这意味着忽略大小写。
“g”标志表示正则表达式应针对字符串中所有可能的匹配项进行测试。
没有g 标志,它只会测试第一个。
【讨论】:
var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
用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 和 /.+/ 之间没有区别,因为它们都只会匹配整个字符串一次。如果正则表达式可以匹配多次或包含组,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,'');
【讨论】: