【发布时间】:2020-12-19 16:29:47
【问题描述】:
我一直在解决代码战中的 katas,但偶然发现了一个我似乎无法找到答案的一般代码问题。
这是我的代码:
function wave(str) {
let arr = [];
for (var i = 0; i < str.length; i++) {
str[i].match(/\S/) && arr.push(str.replace(str[i], str[i].toUpperCase()));
}
return arr;
};
(注意:输入总是小写。)
在wave("abc def"); 的情况下,代码完全符合我的要求:
["Abc def", "aBc def", "abC def", "abc Def", "abc dEf", "abc deF"]
=> 函数接受一个字符串,将字符串中从str[0]开始的一个字母大写,将新单词推入arr,递增i并重复过程直到i < str.length,然后返回arr结果。
但是,例如,如果我输入 wave("acc def");,则只有第一次出现的字母 c 会返回大写:
["Acc def", "aCc def", "aCc def", "acc Def", "acc dEf", "acc deF"]
问题:为什么它会“跳转”第二次出现的“c”以及如何定位字符串中第二次或第 n 次出现的字符?
【问题讨论】:
-
"只有第一次出现" ~ 尝试全局匹配
/\S/g? -
str.replace(str[i], ...)只会替换str[i]处字符的第一次出现(因此它也不适用于cac def) -
取
str[i](.slice()) 的左边部分,取str[i]的大写版本,取str[i](.slice()) 的右边部分——再次组合它们跨度>
标签: javascript string regexp-replace