Javascript 正则表达式:使用/i vs/g(/g替换空白,但/i不';t)

Javascript 正则表达式:使用/i vs/g(/g替换空白,但/i不';t),javascript,regex,Javascript,Regex,我想要一个只包含字母的数组(我正在编写一个函数来检查pangram)。将此代码与/g一起使用,可以得到一个只包含字母而不包含空格的数组(lettersArr.length=34): 但是,使用与/i相同的代码会给我一个数组,其中包含字母以及quick和brown之间的空格(lettersArr.length=43)。既然/i只是不区分大小写,它们不应该给出相同的结果吗?这只是一个正则表达式或Javascript错误吗?您没有将g标志添加到正则表达式中,因此它只是替换第一个匹配项,在您的例子中是第

我想要一个只包含字母的数组(我正在编写一个函数来检查pangram)。将此代码与
/g
一起使用,可以得到一个只包含字母而不包含空格的数组(
lettersArr.length=34
):


但是,使用与
/i
相同的代码会给我一个数组,其中包含字母以及quick和brown之间的空格(
lettersArr.length=43
)。既然
/i
只是不区分大小写,它们不应该给出相同的结果吗?这只是一个正则表达式或Javascript错误吗?

您没有将
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。

/[^a-z]+/i
匹配[space][。]第一个匹配是[space]

当你这样做的时候

   s.replace(/[^a-z]+/i, "")
给出了“敏捷的棕色狐狸跳过了懒狗”。
length=43


/[^a-z]+/g
[T][space][.]全局匹配

这里缺少大写字母T

给出“hequickbrownfoxjumpsoverthelazydog”
长度=34


因此,您需要同时使用这两个标志,因为您也希望匹配大写字母T

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

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

给出所需字符串

“快速浏览信息跳转至蓝色日志”
长度=35


之后您可以拆分它。

您也可以添加两个标志,以提供全局不区分大小写的替换:
s.replace(/[^a-z]+/ig,”)
@Sly_cardinal谢谢,这可能是OP想要的,我已经更新了答案是的,我肯定是指长度34和35。我不知道你们可以同时包含
I
g
,谢谢大家。没有
/g
标志,
.replace()
只匹配第一个匹配项。大多数编程语言默认应用
/g
标志,而JavaScript意外地不应用。您必须明确地添加它。此外,请记住,您可以同时使用多个标志;因此,在这种情况下,标记
/gi
将解决您的问题。
   s.replace(/[^a-z]+/i, "")