2016-11-29 119 views
2

我想将每个句子的开头大写。我有以下代码从其他问题:每个句子的首字母大写

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

但是,如果我不把最后一句点,它不能正常工作。 例如:字符串“这是第一个问题,第二个问题。”返回

+0

是一个句子总是以点结束? –

+0

你需要这个网站吗? (js + css解决方案有效吗?) – Dekel

+0

旁注:在字符类('[]')内转义字符''或'?'是不必要的,因为它们在那里没有特殊的含义 – hindmost

回答

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)或字符串的结束$


有什么不对.+?[\.\?\!](\s|$)

  • [\.\?\!](\s|$)这一次尝试匹配.?!总是跟着空格或句子结尾。但显然最后一部分没有一个
+0

这使得每个单词这不是海报所要求的。 – Archer

+0

@Archer抱歉,我的坏话。希望现在好了 – nu11p01n73R

+1

是的,现在好多了 - 谢谢。有一个适当的+1 :) – Archer

-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()更换前。

+0

试试这个'var str =“这是第一个。这是第二个”;' - 它不起作用。 – Archer

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('. '); 
+0

您的代码只使用点('.')作为分隔符,而原始代码使用'?'和'!' – hindmost