当我在字符串上使用 .split 和 .length 来查找某个字符在字符串中出现的次数时,为什么输出数字总是相差一个?

When I use .split and .length on a string to find how many times a character occurs in a string, why is the output number always off by one?

例如,在不使用 for 循环的情况下,我想计算一个字符在给定字符串中出现的次数。例如,

function countCharacter(str, char) {
  return (str.split(char).length - 1)
}

除非我在代码里放负数1,否则'l'出现的次数'hello'会输出3,这是为什么呢?

因为例如 hello 被 2 个字符 l 拆分将成为 3 个字符串的数组。 “他”、“”、“o”所以你需要减1。

让我们取一个字符串 "aaaBaBaaa"。如果按 "B" 拆分它,您将得到以下数组:["aaa", "a", "aaa"]

总"B"的次数就像是剪了多少次,不过你算的不是剪的多少,而是分的多少。也就是说,如果你这样计算一个字符,数字就是一个。

这里有一个可能有用的比喻:如果我让你把一根胡萝卜切成三份,你需要切成多少片?

现在让我们看看您的代码在做什么。

String.prototype.split() 方法将一个字符串拆分为一个子字符串数组,您使用 char 变量来确定每个拆分的位置。

假设您在字符串 "omit all periods";

上使用它

'omit.all.periods'.split('.');

在这种情况下,我将我的字符串拆分为数组,它沿着句点字符 '.' 拆分,其中有两个。

这给了我一个如下所示的数组:["omit", "all", "periods"]

尽管数组的长度是 3,但我拆分的实际字符数是 2。

我认为您的误解是您没有考虑拆分字符之前的第一个子字符串 - 在这种情况下,“省略”一词 - 因此需要从计算中减去 1。

这有意义吗?

使用正则表达式编写:

function countCharacter(str, char) {
  return str.match(new RegExp(char, "g")).length;
}