用感叹号代替问号,反之亦然

时间:2017-12-27 16:31:25

标签: javascript arrays string character

我需要编写一个接收句子字符串和真/假“喊叫”参数的函数。它应该返回字符串,用感叹号替换任何问号,反之亦然。如果'shouting'为真,则所有字母都应为大写。

function changeIntonation(str, isShouting) {
let myString = '';
let regExcl = /\!/;
let regQmark = /\?/;

let qMarkStr = str.replace(regQmark, '!');
let finalStr = qMarkStr.replace(regExcl, '?');

let newArr = finalStr.split('');

if(isShouting === true) {
  let upperCaseArr = newArr.map(function(char){
    return char.toUpperCase();
  })
  myString = upperCaseArr.join('');
}
return myString;

}

当我尝试转换嘿时,我的代码有效!你好吗?嘿?你怎么样!,但是当我测试嘿?你好吗!它只是大写,感叹号和问号保持不变。 !??!也会失败。 有任何想法吗?谢谢。

3 个答案:

答案 0 :(得分:2)

问题是当您尝试将!替换为?然后?替换为!时,您可能会错误地替换错误,原始!?已存在。

要解决此问题,您必须在一个命令中替换!?,例如(using a function argument on String#replace()):

let finalStr = str.replace(/[!?]/g, function(c) { return c === '?' ? '!' : '?'; });

此外,您不需要在每个字符上调用.toUpperCase(),您可以在字符串上使用它:



function changeIntonation(str, isShouting) {
  let finalStr = str.replace(/[!?]/g, function(c) { return c === '?' ? '!' : '?'; });

  if (isShouting === true) {
    return finalStr.toUpperCase();
  } else {
    return finalStr;
  }
}
console.log(changeIntonation("Hey! How are you?", true));
console.log(changeIntonation("Hey! How are you?", false));
console.log(changeIntonation("Hey? How are you!", true));
console.log(changeIntonation("Hey? How are you!", false));




答案 1 :(得分:1)

您需要同时替换这两个字符。

看看HERE(第二个例子)

答案 2 :(得分:1)

感谢@acdcjunior,他在我面前回答,我没有注意到他已经回答了!我的代码看起来像他的,但是更紧凑。

function changeIntonation(str, isShouting) {
    str = str.replace(/\?|\!/g, function(match) {
        return match == "?" ? "!" : "?";
    });
    return isShouting ? str.toUpperCase() : str;
}

首先,我注意到你将单个字符设为大写,然后将它们全部加入整个字符串中。为什么?我把整个字符串直接做成大写字母 然后我明白问题是,当你用感叹号替换问号时,前面的那些问题和感叹号现在只是感叹号,所以如果你尝试用问题标记替换感叹号,你将全部替换它们。 因此,我选择用回调替换问题和惊叹号,并检查回调,如果出现的是一个或另一个要正确替换。