2016-11-29 164 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