我想将每个句子的开头大写。我从其他问题得到以下代码:
function applySentenceCase(str) {
return str.replace(/.+?[\.\?\!](\s|$)/g, function (txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
}
但是,如果我没有为最后一句加点,那么它就无法正常工作。 例如:对于字符串“这是第一个问题。第二个问题”它返回“这是第一个问题。第二个问题”
答案 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()
。