不明白为什么replace()方法没有按预期工作

时间:2017-03-29 02:59:53

标签: javascript replace

处理以下问题:

创建一个名为str的函数,其中输入为alienLanguage("My name is John"),输出应该大写除了每个单词的最后一个字母之外的所有字母

"My NAMe Is JOHn"应该返回function alienLanguage(str){ var words = str.toUpperCase().split(' ').map(function (a) { return a.replace(a[a.length - 1], a[a.length - 1].toLowerCase()) }); return words.join(' '); }

这就是我编码的内容:

Expected: '\'THIs Is An EXAMPLe\'', instead got: '\'THIs Is An eXAMPLE\'' 

除以下情况外,所有示例测试用例都有效:

eXAMPLE

为什么e中的e变成小写?不应该一切都自动转向upperCase吗?

编辑:我刚刚意识到有2个e,第一个被替换。如何替换上一个template<typename Derived> void FEigentoFile(const Eigen::EigenBase<Derived> &in_mat, const std::string filename) ?并且不是指定的最后一个字符?

7 个答案:

答案 0 :(得分:2)

  

是否已经指定了最后一个字符?

不,您只指定要替换的字符,而不是指定的位置。 replace在字符串中搜索表达式。

  

如何更换最后一个?

根本不使用replace。无论如何它确实构造了一个新的字符串,你可以更容易地做到这一点:

function alienLanguage(str) {
  return str.split(' ').map(function(a) {
    return a.slice(0, -1).toUpperCase() + a.slice(-1).toLowerCase();
  }).join(' ');
}

您也可以使用replace,但会将其与正则表达式一起使用:

function alienLanguage(str) {
  return str.toUpperCase().replace(/.\b/g, function(last) {
//                                 ^^^^^^ matches all characters before a word boundary
    return last.toLowerCase();
  });
}

答案 1 :(得分:2)

您无需将字符串拆分为单词。只需在你的正则表达式中使用positive lookahead assertion来大写所有紧跟着另一个字母的字母,如下所示:

function alienLanguage(str){
    return str.replace(/(\w)(?=\w)/g, l => l.toUpperCase())
}

答案 2 :(得分:0)

replace()正在使用模式(或正则表达式)进行搜索,它会替换所有出现的内容。

相反,您希望截断并创建一个新字符串,这在其他语言中称为赋值(但JS中的字符串是不可变的)。有关详细信息,请参阅here

答案 3 :(得分:0)

您可以使用substring。你的replace替换并替换了单词中最后一个字符的第一个出现 - 绝对是你之后的:

function alienLanguage(str){
  var words = str.toUpperCase().split(' ').map(function (a) {
    return a.length ? a.substring(0, a.length - 2) + a[a.length - 1].toLowerCase() : a;
  });
  return words.join(' ');
}

答案 4 :(得分:0)

正如@TatsuyukiIshi所说,您需要更改replace()的使用以进行常规分配。如需其他帮助,这里是alienLanguage功能的更新版本:

function alienLanguage(str){
    return str.toUpperCase().split(' ').map(function(word) {
        return word.slice(0, -1) + word.substr(-1).toLowerCase()
    }).join(' ')
}

小提琴here

额外说明:

word.slice(0,-1)返回单词减去最后一个字符。

word.substr(-1)将最后一个字符作为字符串返回。

.map()会返回一个数组,因此您可以直接在结果上调用join()

答案 5 :(得分:0)

不是搜索字母,而是将字符串的大写部分连接到带有小写的最后一个字母的最后一个字母。

这应该可以解决问题:

function alienLanguage(str) {
  return str.split(' ').map(function(a) {
    return a.slice(0, -1).toUpperCase() + a.slice(-1).toLowerCase();
  }).join(' ');
}

答案 6 :(得分:0)

试试吧。

function alienLanguage(str){
   var words = str.toUpperCase().split(' ').map(function (a) {
   return a.substr(0, a.length - 1) +a[a.length - 1].toLowerCase() + a.substr(a.length - 1 + 1);
   });
  return words.join(' ');
 }