我想要一个只包含字母的数组(我正在编写一个函数来检查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错误吗?
/[^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
之后你可以拆分它。
你没有将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的。