2016-11-29 19 views
2

各文の先頭を大文字にします。私は他の質問から次のコードを持っている:各文の先頭を大文字にする

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

をしかし、私は最後の文のドットを入れていない場合は、それが正常に動作しません。たとえば :「これは最初の質問である2番目の質問」の文字列のためにそれを返す

+0

は常にドットで終わる文のですか? –

+0

ウェブにはこれが必要ですか? (js + css solutions works?) – Dekel

+0

Sidenote:文字クラス( '[]')の中の '.'や'? 'のような文字をエスケープするのは特別な意味を持たないので不要です – 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 

です「これは最初の質問SECOND質問です」

またはES6で:

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

変更

  • [.?!]これは文字クラスです。クラス内の文字をエスケープする必要はありません。

  • (?:[.?!]\s|$)これは.+?[\.\?\!](\s|$)

    • と間違っている何.または?または!スペースが続く(\s)OR文字列の最後$


    と一致しますこれは、.または?または!に常に一致するように試みます。そのあとには常にスペースまたは文末が続きます。しかし明らかに最後の部分には1つもありません

+0

ポスターが求めるものではありません。 – Archer

+0

@Archer申し訳ありませんが悪いです。今は大丈夫ですか? – nu11p01n73R

+1

ええ、今はるかに良い - ありがとう。適切な+1をしてください:) – Archer

-1

/^.|\.\s*\w/と一致します。

最初の部分は、行の最初の文字を大文字で表しています。

2番目の部分は、.(前の文の末尾)、空白(\ s)の後に1文字の英数字があることを示します。

次にすべてを大文字に置き換えてください。

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

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

EDIT 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

関連する問題