如何把每个句子的首字母大写?

我知道如何把每个单词中的第一个字母大写。 但我想知道如何利用C#中每个句子的首字母大写。

这不一定是一个微不足道的问题。 句子可以以许多不同的标点符号结束,并且那些相同的标点符号并不总是表示句子的结尾(像博士这样的缩写可能会造成特定问题,因为它们可能存在很多)。

话虽这么说,你可能能够通过使用正则表达式在句子结束标点符号后查找单词来获得“足够好”的解决方案,但是你必须添加一些特殊情况。 逐字或逐字处理字符串可能更容易。 您仍然需要处理所有相同的特殊情况,但它可能比尝试将其构建为正则表达式更容易。

语法和标点符号有很多奇怪的规则。 你想出的任何解决方案都可能无法将它们全部考虑在内。 有些事情需要考虑:

  • 句子可以以不同的标点符号结尾(。!?)
  • 一些标点符号表示结束句子也可能在句子中间使用(例如,像Dr. Dr.先生这样的缩写)
  • 句子可能包含嵌套句子。 引用可能会造成一个特殊的问题(例如,他说,“这是一个难题!我想知道,”他沉思道,“如果可以解决的话。”)

将句子视为包含空格的单词,以句点结尾。

这个页面上有一些VB代码,转换成C#不会太难。

但是,后续post指出了算法中的错误。

这个博客有一些C#代码声称可以工作:

它会在每个句号(句号),问号和感叹号后自动将首字母大写。

更新2010年2月16日:我已经重做了它,因此它不会影响URL等字符串

不要忘记带括号的句子。 此外,*如果用作粗体文本的idicator。

http://www.grammarbook.com/punctuation/parens.asp

我需要做类似的事情,这符合我的目的。 我将我的“句子”作为IEnumerable字符串传递。

 // Read sentences from text file (each sentence on a separate line) IEnumerable lines = File.ReadLines(inputPath); // Call method below lines = CapitalizeFirstLetterOfEachWord(lines); private static IEnumerable CapitalizeFirstLetterOfString(IEnumerable inputLines) { // Will output: Lorem lipsum et List outputLines = new List(); TextInfo textInfo = new CultureInfo("en-US", false).TextInfo; foreach (string line in inputLines) { string lineLowerCase = textInfo.ToLower(line); string[] lineSplit = lineLowerCase.Split(' '); bool first = true; for (int i = 0; i < lineSplit.Length; i++ ) { if (first) { lineSplit[0] = textInfo.ToTitleCase(lineSplit[0]); first = false; } } outputLines.Add(string.Join(" ", lineSplit)); } return outputLines; 

}

我知道我迟到了,但就像你一样,我需要把每个句子上的每个第一个字符都用掉。 我刚刚来到这里(当我正在研究时还有很多其他页面)并没有找到任何帮助我的东西。 所以,我烧了一些神经元,自己做了一个算法。

这是我扩展句子的扩展方法:

 public static string CapitalizeSentences(this string Input) { if (String.IsNullOrEmpty(Input)) return Input; if (Input.Length == 1) return Input.ToUpper(); Input = Regex.Replace(Input, @"\s+", " "); Input = Input.Trim().ToLower(); Input = Char.ToUpper(Input[0]) + Input.Substring(1); var objDelimiters = new string[] { ". ", "! ", "? " }; foreach (var objDelimiter in objDelimiters) { var varDelimiterLength = objDelimiter.Length; var varIndexStart = Input.IndexOf(objDelimiter, 0); while (varIndexStart > -1) { Input = Input.Substring(0, varIndexStart + varDelimiterLength) + (Input[varIndexStart + varDelimiterLength]).ToString().ToUpper() + Input.Substring((varIndexStart + varDelimiterLength) + 1); varIndexStart = Input.IndexOf(objDelimiter, varIndexStart + 1); } } return Input; } 

有关算法的详细信息:
这个简单的算法开始删除所有双空格。 然后,它将字符串的第一个字符大写。 然后搜索每个分隔符。 找到一个时,将下一个字符大写。
我轻松添加/删除或编辑分隔符,因此您可以通过稍微更改来更改代码的工作方式。 它不会检查子字符串是否超出字符串长度,因为分隔符以空格结尾,算法以“Trim()”开头,因此如果在字符串中找到的每个分隔符将跟随另一个字符。

重要:
您没有指定您的需求。 我的意思是,它是一个语法校正器,只是为了美化文本等…所以,重要的是要考虑我的算法对我的需求来说是完美的,可能与你的不同。
*这个算法的创建是为了格式化一个“规范化的”产品描述“(几乎总是它完全是大写的),以一种很好的格式提供给用户(更具体地说,我需要为用户显示一个漂亮的”更小“的文本所以,大写字母中的所有字符都与我想要的字符相反。 因此,它并非创造出语法上的完美。
*此外,可能还有一些例外情况,即由于格式错误,角色不会被大写。
*我选择在分隔符中包含空格,因此“ http://www.stackoverflow.com ”不会成为“ http://www.Stackoverflow.Com ”。 另一方面,像“盒子是蓝色的,在地板上”的句子将变成“盒子是蓝色的,在地板上”,而不是 “盒子是蓝色的。它在地板上”
*在缩写的情况下,它将大写,但再一次,它不是一个问题,因为我的需求只是显示产品描述(语法不是极其批评)。 在像Mr.或Dr.这样的缩写中,第一个字符是一个名字,因此,它是完美的资本化。

如果您或其他人需要更准确的算法,我将很乐意改进它。

希望我能帮助别人!

但是,您可以创建一个类或方法来转换TitleCase中的每个文本。 以下是您只需调用该方法的示例。

 public static string ToTitleCase(string strX) { string[] aryWords = strX.Trim().Split(' '); List lstLetters = new List(); List lstWords = new List(); foreach (string strWord in aryWords) { int iLCount = 0; foreach (char chrLetter in strWord.Trim()) { if (iLCount == 0) { lstLetters.Add(chrLetter.ToString().ToUpper()); } else { lstLetters.Add(chrLetter.ToString().ToLower()); } iLCount++; } lstWords.Add(string.Join("", lstLetters)); lstLetters.Clear(); } string strNewString = string.Join(" ", lstWords); return strNewString; }