正则表达式:使用/i还是/g(/g替换空格但/i不替换)

4

我希望得到一个仅包含字母的数组(我正在编写一个检查一句话是否为完美句的函数)。如果使用/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后,我得到了一个包含字母和quick和brown之间空格的数组(lettersArr.length = 43)。由于/i只是不区分大小写,它们不应该给出相同的结果吗?这只是一个正则表达式或JavaScript的错误吗?


1
没有 /g 标志,.replace() 只匹配第一次出现的情况。大多数编程语言默认应用 /g 标志,但是 JavaScript 意外地没有。您必须明确添加它。此外,请记住您可以同时使用许多标志;因此,在这种情况下标记 /gi 将解决您的问题。 - FactoryAidan
2个回答

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。

5
你可以同时添加两个标志,以获得全局不区分大小写的替换结果: s.replace(/[^a-z]+/ig, "") - Sly_cardinal
@Sly_cardinal 谢谢,这可能是 OP 想要的,我已经更新了答案。 - wilsonzlin
1
是的,我肯定是指长度为34和35。我不知道你可以同时包含ig,谢谢大家。 - Deegii Altangerel

1

/[^a-z]+/i 匹配 [空格][.][空格] 第一个匹配项[空格]

当你执行

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

给出 'Thequick brown fox jumps over the lazy dog.'长度为43


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

这里缺少大写字母 T

"hequickbrownfoxjumpsoverthelazydog" 进行匹配,长度为34


所以你需要同时使用这两个标志,因为你想匹配大写字母T。
/[^a-z]+/gi [空格][.] 匹配全局大小写不敏感
s.replace(/[^a-z]+/gi, "") 给出所需的字符串
"Thequickbrownfoxjumpsoverthelazydog" length = 35
之后你可以将其拆分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接