将每个句子的开头大写

时间:2016-11-29 15:40:47

标签: javascript regex

我想将每个句子的开头大写。我从其他问题得到以下代码:

function applySentenceCase(str) {
    return str.replace(/.+?[\.\?\!](\s|$)/g, function (txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    });
}

但是,如果我没有为最后一句加点,那么它就无法正常工作。 例如:对于字符串“这是第一个问题。第二个问题”它返回“这是第一个问题。第二个问题”

3 个答案:

答案 0 :(得分:4)

正则表达式的问题是分组(...)

str.replace(/.+?(?:[.?!]\s|$)/g, function (txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    });
// Outputs
//"This is the first question. Second question. Third question

或者在es6:

str.replace(/.+?(?:[.?!]\s|$)/g, txt => `${txt.charAt(0).toUpperCase()}${txt.substring(1).toLowerCase()}`);

<强>更改

  • [.?!]这是一个角色类。没有必要在类中转义字符。

  • (?:[.?!]\s|$)这符合.?!后跟空格(\s)或字符串结尾{{1} }

$

出了什么问题
  • .+?[\.\?\!](\s|$)此选项会尝试匹配[\.\?\!](\s|$).?,后面跟一个空格或句末。但显然最后一部分没有一个

答案 1 :(得分:2)

在这种情况下,我实际上并不需要使用正则表达式:

var sentences = "THIS IS THE FIRST QUESTION. SECOND QUESTION";
sentences.split('.').map(function(item) {
    var sentence = item.trim();
    return sentence.charAt(0).toUpperCase() + sentence.substr(1).toLowerCase();
}).join('. ');

答案 2 :(得分:-1)

/^.|\.\s*\w/匹配。

第一部分用大写字母表示第一个字符。

第二部分说找到.(上一句末尾),任意数量的空格(\ s)后跟1个字母数字字符。

然后用大写版本替换所有。

var str = "this is the first question. second question.";

console.log(str.toLowerCase().replace(/^.|\.\s*\w/ig, function(txt) {
  return txt.toUpperCase()
}));

编辑1

如果你全部用大写字母,只需在替换之前在字符串上调用toLowerCase()