当我在字符串上使用 .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;
}
例如,在不使用 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;
}