2013-09-30 2 views
4

Я хочу, чтобы введенная строка была преобразована в фразу предложения в любом случае.Преобразование строки в фразу предложения в javascript

Как

Привет всем, это Derp. спасибо всем, чтобы ответить на мой запрос.

быть преобразованы в

Привет всем, это Derp. Спасибо всем, что ответили на мой запрос.

+1

... и? Что вы пробовали? Где вы застряли? –

+1

Подсказка: попробуйте написать регулярное выражение. Найдите первую букву предложений и используйте периоды + пробелы для разграничения предложений. Удачи. Если вам все еще нужна помощь после попытки повторного выражения, отправьте его здесь, и мы увидим, что мы можем сделать. – Jackson

+0

Почему вы идете на javascript, когда можете сделать это с помощью CSS? –

ответ

5

Попробуйте это, он будет хорошо работать для вас. Он также будет работать для Строка с ведущими пространствами.

var string="hi all, this is derp. thank you all to answer my query."; 
var n=string.split("."); 
var vfinal="" 
for(i=0;i<n.length;i++) 
{ 
    var spaceput="" 
    var spaceCount=n[i].replace(/^(\s*).*$/,"$1").length; 
    n[i]=n[i].replace(/^\s+/,""); 
    var newstring=n[i].charAt(n[i]).toUpperCase() + n[i].slice(1); 
    for(j=0;j<spaceCount;j++) 
    spaceput=spaceput+" "; 
    vfinal=vfinal+spaceput+newstring+"."; 
} 
vfinal=vfinal.substring(0, vfinal.length - 1); 
alert(vfinal); 
+0

отлично. это будет работать для ведущего пространства в строке. – unknownbits

+0

спасибо, что ответ .. помог мне .. – Mahendra

+0

ужасный ответ. Помогает много – Ratna

13

Я придумал этот вид RegExp:

var rg = /(^\w{1}|\.\s*\w{1})/gi; 
var myString = "hi all, this is derp. thank you all to answer my query."; 
myString = myString.replace(rg, function(toReplace) { 
    return toReplace.toUpperCase(); 
}); 
+0

Он не будет работать для строки с ведущими пробелами после "." – unknownbits

+0

Хорошо, я добавлю, что одна звездочка там и будет. – zvona

+0

good.it очень короткий. Мне нравится этот ответ. – unknownbits

0

демоверсию

http://jsfiddle.net/devmgs/6hrv2/

function sentenceCase(strval){ 

var newstrs = strval.split("."); 
    var finalstr=""; 
    //alert(strval); 
    for(var i=0;i<newstrs.length;i++) 
     finalstr=finalstr+"."+ newstrs[i].substr(0,2).toUpperCase()+newstrs[i].substr(2); 
    return finalstr.substr(1); 
} 

Берегитесь все точки не всегда представляют конец линии и может быть аббревиатуры и т. д. Также он не уверен, что один из них определяет пространство после полной остановки. Эти условия делают этот сценарий уязвимым.

0

Вы также можете попробовать этот

<script> 
var name="hi all, this is derp. thank you all to answer my query."; 
var n = name.split("."); 
var newname=""; 
for(var i=0;i<n.length;i++) 
{ 
var j=0; 
while(j<n[i].length) 
{ 
if(n[i].charAt(j)!= " ") 
    { 
     n[i] = n[i].replace(n[i].charAt(j),n[i].charAt(j).toUpperCase()); 
      break; 
    } 
else 
    j++; 
} 

newname = newname.concat(n[i]+"."); 
} 
alert(newname); 
</script> 
0

Это решение, которое я закончил с использованием:

str = 'hi all, this is derp. thank you all to answer my query.'; 
temp_arr = str.split('.'); 
for (i = 0; i < temp_arr.length; i++) { 
temp_arr[i]=temp_arr[i].trim() 
temp_arr[i] = temp_arr[i].charAt(0).toUpperCase() + temp_arr[i].substr(1).toLowerCase(); 
} 
str=temp_arr.join('. ') + '.'; 
return str; 
0

Ниже код работает для меня, как и ожидалось.

function toSentenceCase(inputString) { 
     inputString = "." + inputString; 
    var result = ""; 
    if (inputString.length == 0) { 
     return result; 
    } 

    var terminalCharacterEncountered = false; 
    var terminalCharacters = [".", "?", "!"]; 
    for (var i = 0; i < inputString.length; i++) { 
     var currentChar = inputString.charAt(i); 
     if (terminalCharacterEncountered) { 
      if (currentChar == ' ') { 
       result = result + currentChar; 
      } else { 
       var currentCharToUpperCase = currentChar.toUpperCase(); 
       result = result + currentCharToUpperCase; 
       terminalCharacterEncountered = false; 
      } 
     } else { 
      var currentCharToLowerCase = currentChar.toLowerCase(); 
      result = result + currentCharToLowerCase; 
     } 
     for (var j = 0; j < terminalCharacters.length; j++) { 
      if (currentChar == terminalCharacters[j]) { 
       terminalCharacterEncountered = true; 
       break; 
      } 
     } 
    } 
     result = result.substring(1, result.length - 1); 
    return result; 
} 
0

Я написал функцию на основе 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; 
} 
Смежные вопросы