在Javascript中将字符串转换为句子格式

8

我希望输入的字符串可以以句子格式显示,无论其原来的大小写是什么。

例如:

hi all, this is derp. thank you all to answer my query.

将被转换为:

Hi all, this is derp. Thank you all to answer my query.


1
你尝试过什么?你卡在哪里了? - T.J. Crowder
1
提示:尝试编写正则表达式。找到句子的第一个字母,并使用句点+空格来分隔句子。祝你好运。如果您在尝试正则表达式后仍需要帮助,请在此处发布,我们会尽力提供帮助。 - Jackson
为什么你可以使用CSS完成任务,却选择了JavaScript? - Sarvap Praharanayuthan
注意:并非所有句号都表示句子的结尾。 - Alnitak
11个回答

22

我想出了这种正则表达式:

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();
});

好的,我会在那里添加一个星号,这样就可以了。 - Samuli Hakoniemi
但是它对于“ hi all,----”开头的空格无效。你也必须编辑它。 - unknownbits
1
var rg = /(^\s\w{1}|.\s\w{1})/gi; 它会起作用的。请更新。 - unknownbits
2
我回答了最初发布的问题。如果 OP 想对所有可能的情况(包括拼写错误等)进行特定更改,他必须自己学习正则表达式。这个答案是最短的可用答案,它演示了在正则表达式中使用变量,并将它们循环替换到 replace() 函数中。 - Samuli Hakoniemi

7

尝试这个,它对你很有效。它也适用于具有前导空格的字符串

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);

很好。这将适用于字符串中的前导空格。 - unknownbits
很棒的答案。非常有帮助。 - Ratna Srikanth

2

这是我对这篇帖子的修改,该帖子是为了将文本转换为标题大小写。

您可以立即将字符串toLowerCase,然后只需将每个单词的第一个字母toUpperCase。变成非常简单的一行代码:

与使每个单词都大写不同。此示例与多行和字符串(如A.M.P.M.)兼容,并且当然适用于在句点和空格字符之后出现的任何单词。

您可以在下面的toLowerCaseNames函数和toUpperCaseNames示例中添加自己的自定义单词。


"Original Answer"翻译成"最初的回答"

// Based off this post: https://dev59.com/WXVC5IYBdhLWcg3wvT7g#40111894
var str = '-------------------\nhello world!\n\n2 Line Breaks. What is going on with this string. L.M.A.O.\n\nThee End...\nlower case example 1\nlower case example 2\n-------------------\nwait there\'s more!\n-------------------\nhi all, this is derp. thank you all to answer my query.';
function toTitleCase(str) {
 return str.toLowerCase().replace(/\.\s*([a-z])|^[a-z]/gm, s => s.toUpperCase());
}

// Add your own names here to override to lower case
function toLowerCaseNames(str) {
  return str.replace(/\b(lower case example 1|lower case example 2)\b/gmi, s => s.toLowerCase());
}

// Add your own names here to override to UPPER CASE
function toUpperCaseNames(str) {
  return str.replace(/\b(hello|string)\b/gmi, s => s.toUpperCase());
}

console.log(toLowerCaseNames(toUpperCaseNames(toTitleCase(str))));

你可以将上面的所有正则表达式粘贴到https://regexr.com/中,以分解它们的工作原理。最初的回答。

1
尝试演示。

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);
}

要注意的是,句号并不总是表示行末,有时可能是缩写等。此外,也不能确定是否在句号后打了空格。这些条件使得此脚本容易受到攻击。


1
以下 SentenceCase 代码适用于我,并且也能处理缩写词,例如上午等。可能需要改进。

//=============================
// SentenceCase Function
// Copes with abbreviations
// Mohsen Alyafei (12-05-2017)
//=============================

function stringSentenceCase(str) {
  return str.replace(/\.\s+([a-z])[^\.]|^(\s*[a-z])[^\.]/g, s => s.replace(/([a-z])/,s => s.toUpperCase()))
}
//=============================

console.log(stringSentenceCase(" start sentence.   second sentence . e.g. a.m. p.m."))
console.log(stringSentenceCase("first sentence. second sentence."))
console.log(stringSentenceCase("e.g. a.m. p.m. P.M. another sentence"))


0
在每一行,这个脚本将会打印......星期日、星期一、星期二、星期三、星期四、星期五、星期六。
let rg = /(^\w{1}|\.\s*\w{1})/gi;

const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];

for(let day of days) {
    console.log(day.replace(rg, function(toReplace) {
    return toReplace.toUpperCase();
}))

每行将打印..... 星期日 星期一 星期二 星期三 星期四 星期五 星期六 - Tanuj
为什么不在答案本身中添加澄清,而是作为评论呢? - FrankS101

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
function toTitleCase(str) {
  if (!str) return "";
  return str
    .replace(/(?:^\w|[A-Z]|\b\w)/g, function (word, index) {
      return index === 0 ? word.toUpperCase() : word.toLowerCase();
    })
    .replace(/\s+/g, "");
}

请问您能否给这个答案添加一些上下文和解释,谢谢。 - Nathaniel Flick

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接