【问题标题】:JavaScript: Amend the SentenceJavaScript:修改句子
【发布时间】:2017-07-24 09:07:45
【问题描述】:

我遇到了以下 javaScript 问题。

问题: 你得到了一个字符串 s,它应该是一个句子。但是,有人忘记在不同单词之间放置空格,并且出于某种原因,他们将每个单词的第一个字母大写。作如下修改后返回句子:

在单词之间放置一个空格。 将大写字母转换为小写。

例子

“CodefightsIsAwesome”,输出应该是“codefights is awesome”;

“你好”,输出应该是“你好”。

我当前的代码是:

现在,我的第二个 for 循环只是手动从字符串中切分部分。 我怎样才能使这个动态并在大写字符串前面插入“空格”?

【问题讨论】:

  • s的值是多少
  • @JijoCleetus 输入字符串?

标签: javascript string slice


【解决方案1】:

您可以使用String.prototype.match()RegExp /[A-Z][^A-Z]*/g 来匹配A-Z 后跟一个或多个不是A-Z 的字符,或字符串末尾的字符;链 Array.prototype.map() 以在匹配的单词上调用 .toLowerCase().join() 使用参数 " " 以在结果字符串的匹配之间包含空格字符。

var str = "CodefightsIsAwesome";
var res = str.match(/[A-Z][^A-Z]*/g).map(word => word.toLowerCase()).join(" ");
console.log(res);

或者,按照@FissureKing 的建议,您可以将String.prototype.repalce().trim().toLowerCase() 链接使用

var str = "CodefightsIsAwesome";
var res = str.replace(/[A-Z][^A-Z]*/g, word => word + ' ').trim().toLowerCase();
console.log(res);

【讨论】:

  • 也许是* 而不是+,以允许使用一个字母的单词?
  • @nnnnnn 查看更新后的帖子。用[^A-Z] 替换[a-z] 以匹配不是大写字母的字符。
  • 那么如果输入是"ThereIsNobodyCrazierThanI"?
  • @nnnnnn /[A-Z][^A-Z]+|.$/g
  • 我并不是说你的方法是错误的。我只是认为执行str => str.replace(/[A-Z][^A-Z]+/g, word => word + ' ').trim().toLowerCase() 之类的操作更具可读性。除非,如果这不是 SO 评论,我不会在一行中链接三个方法 :)
【解决方案2】:

与其编写一个循环,我会用(合理的)简单的字符串替换在一行中完成:

function amendTheSentence(s) {
  return s.replace(/[A-Z]/g, function(m) { return " " + m.toLowerCase() })
          .replace(/^ /, "");
}

console.log(amendTheSentence("CodefightsIsAwesome"));
console.log(amendTheSentence("noCapitalOnFirstWord"));
console.log(amendTheSentence("ThereIsNobodyCrazierThanI"));

也就是说,用正则表达式/[A-Z]/匹配任何大写字母,用空格加上那个小写字母替换匹配的字母,然后删除在字符串开头添加的所有空格。

进一步阅读:

【讨论】:

    【解决方案3】:

    我们可以循环一次。

    以下假设在我们的返回数组中第一个字符应始终大写。如果不是这样,只需从下面删除第一个 if 块。

    对于之后的每个字符,我们检查它是否大写。如果是这样,我们将它添加到我们的返回数组中,并以空格开头。如果没有,我们将它原样添加到我们的数组中。

    最后,我们将数组重新连接成一个字符串并返回。

    const sentence = "CodefightsIsAwesome";
    
    const amend = function(s) {
      ret = [];
      for (let i = 0; i < s.length; i++) {
        const char = s[i];
        if (i === 0) {
          ret.push(char.toUpperCase());
        } else if (char.toUpperCase() === char) {
          ret.push(` ${char.toLowerCase()}`);
        } else {
          ret.push(char);
        }
      }
      return ret.join('');
    };
    
    console.log(amend(sentence));

    【讨论】:

      猜你喜欢
      • 2021-07-04
      • 1970-01-01
      • 2018-05-15
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多