【发布时间】:2022-12-17 00:32:33
【问题描述】:
正则表达式中的g标志是什么意思?
/.+/g 和 /.+/ 有什么区别?
【问题讨论】:
标签: javascript regex
正则表达式中的g标志是什么意思?
/.+/g 和 /.+/ 有什么区别?
【问题讨论】:
标签: javascript regex
g 用于全局搜索。这意味着它将匹配所有出现的情况。您通常还会看到 i,表示忽略大小写。
“g”标志表示应针对字符串中所有可能的匹配项测试正则表达式。
如果没有
g标志,它只会测试第一个。此外,请确保检查cchamberlain's answer below 以了解有关如何设置
lastIndex属性的详细信息,这可能会在针对一系列值重新使用正则表达式时导致意外的副作用。
【讨论】:
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' ]
【讨论】:
正如@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 是全局搜索标志。
全局搜索标志使 RegExp 在整个字符串中搜索模式,创建它可以找到的与给定模式匹配的所有匹配项的数组。
所以/.+/g 和/.+/ 之间的区别是g 版本会找到每一个匹配项,而不仅仅是第一个匹配项。
【讨论】:
/.+/g 和 /.+/ 之间没有区别,因为它们都只会匹配整个字符串一次。如果正则表达式可以匹配多次或包含组,则 g 会有所不同,在这种情况下,.match() 将返回匹配数组而不是组数组。
【讨论】:
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标志的含义外,它还影响regexp.lastIndex属性:
lastIndex 是正则表达式的读/写整数属性 指定开始下一场比赛的索引的实例。 (...) 仅当正则表达式实例时才设置此属性 使用“g”标志表示全局搜索。
【讨论】:
正则表达式中的 G 定义了全局搜索,这意味着它将搜索所有行上的所有实例。
【讨论】:
将给出基于字符串的示例。如果我们想从一个 细绳。 让我们说如果我们想从“hello world”中删除所有出现的“o”和“”
"hello world".replace(/o/g,'');
【讨论】:
在我的例子中,我有一个问题,我需要每次从第一个字母开始重新评估字符串,为此必须删除/my_regexp/G(全球标志)停止移动最后索引.
如 mdn 中所述:
确保设置了全局 (g) 标志,否则 lastIndex 将永远不会被推进。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#specifications
【讨论】: