Я написал функцию на основе FSM для объединения нескольких пробельных символов и преобразования строки в фразу предложения. Он должен быть быстрым, потому что он не использует сложное регулярное выражение или split
, и если ваша среда выполнения JavaScript имеет эффективную конкатенацию строк, тогда это должен быть самый быстрый способ сделать это. Это также позволяет легко добавлять исключения для особых случаев.
Производительность, возможно, может быть улучшена дополнительно, заменив пробельные регулярные выражения функцией сравнения символов.
function toSentenceCase(str) {
var states = {
EndOfSentence : 0,
EndOfSentenceWS: 1, // in whitespace immediately after end-of-sentence
Whitespace : 2,
Word : 3
};
var state = states.EndOfSentence;
var start = 0;
var end = 0;
var output = "";
var word = "";
function specialCaseWords(word) {
if(word == "i") return "I";
if(word == "assy") return "assembly";
if(word == "Assy") return "Assembly";
return word;
}
for(var i = 0; i < str.length; i++) {
var c = str.charAt(i);
switch(state) {
case states.EndOfSentence:
if(/\s/.test(c)) { // if char is whitespace
output += " "; // append a single space character
state = states.EndOfSentenceWS;
}
else {
word += c.toLocaleUpperCase();
state = states.Word;
}
break;
case states.EndOfSentenceWS:
if(!(/\s/.test(c))) { // if char is NOT whitespace
word += c.toLocaleUpperCase();
state = states.Word;
}
break;
case states.Whitespace:
if(!(/\s/.test(c))) { // if char is NOT whitespace
output += " "; // add a single whitespace character at the end of the current whitespace region only if there is non-whitespace text after.
word += c.toLocaleLowerCase();
state = states.Word;
}
break;
case states.Word:
if(c == ".") {
word = specialCaseWords(word);
output += word;
output += c;
word = "";
state = states.EndOfSentence;
} else if(!(/\s/.test(c))) { // if char is NOT whitespace
// TODO: See if `c` is punctuation, and if so, call specialCaseWords(word) and then add the puncutation
word += c.toLocaleLowerCase();
}
else {
// char IS whitespace (e.g. at-end-of-word):
// look at the word we just reconstituted and see if it needs any special rules
word = specialCaseWords(word);
output += word;
word = "";
state = states.Whitespace;
}
break;
}//switch
}//for
output += word;
return output;
}
... и? Что вы пробовали? Где вы застряли? –
Подсказка: попробуйте написать регулярное выражение. Найдите первую букву предложений и используйте периоды + пробелы для разграничения предложений. Удачи. Если вам все еще нужна помощь после попытки повторного выражения, отправьте его здесь, и мы увидим, что мы можем сделать. – Jackson
Почему вы идете на javascript, когда можете сделать это с помощью CSS? –