RegEx:使用/ i vs. / g(/ g替换空格但/ i不替换)

问题描述 投票:4回答:2

我想要一个只包含字母的数组(我正在编写一个函数来检查pangrams)。使用/g的代码给我一个只有字母而没有空格的数组(lettersArr.length = 34):

var s = "The quick brown fox jumps over the lazy dog."
var lettersArr = s.replace(/[^a-z]+/i, "").split("");
console.log(lettersArr);

然而,使用与/i相同的代码给了我一个包含字母的数组以及快速和棕色(lettersArr.length = 43)之间的空格。由于/i只是不区分大小写,它们不应该给出相同的结果吗?这只是一个RegEx或Javascript错误吗?

javascript regex
2个回答
1
投票

/[^a-z]+/i匹配[空间] [。]第一场比赛是[空间]

当你这样做

   s.replace(/[^a-z]+/i, "")

'Thequick brown fox jumps over the lazy dog.' length = 43


/[^a-z]+/g [T] [space] [。]匹配全球

这里缺少Capital T.

"hequickbrownfoxjumpsoverthelazydog" length = 34


所以你需要使用两个标志,因为你也想匹配大写字母T.

/[^a-z]+/gi [space] [。]匹配全局不区分大小写

s.replace(/[^a-z]+/gi, "")

提供所需的字符串

"Thequickbrownfoxjumpsoverthelazydog" length = 35

之后你可以拆分它。


1
投票

你没有将g标志添加到正则表达式,所以它只替换第一个匹配,在你的情况下是第一个空格字符。

如果你添加g标志,它的工作原理:

var s = "The quick brown fox jumps over the lazy dog."
var lettersArr = s.replace(/[^a-z]+/gi, "").split("");
console.log(lettersArr);

使用g标志意味着.replace不会在第一场比赛中停止。

请注意,如果没有i,数组的长度应为35,并且使用i 34,所以我不确定你是如何获得26或28的。

© www.soinside.com 2019 - 2024. All rights reserved.