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

时间:2010-05-06 21:20:11

标签: c# string

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

8 个答案:

答案 0 :(得分:12)

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

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

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

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

答案 1 :(得分:3)

作为第一个近似值,您可以将[a-z]\.[ \n\t]之类的任何序列视为句子的结尾。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

this page上有一些VB代码,转换为C#应该不会太难。

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

This blog有一些声称有效的C#代码:

  

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

     

更新2010年2月16日:我已经重新设计它,以免影响URL等字符串

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

// Read sentences from text file (each sentence on a separate line)
IEnumerable<string> lines = File.ReadLines(inputPath);

// Call method below
lines = CapitalizeFirstLetterOfEachWord(lines);

private static IEnumerable<string> CapitalizeFirstLetterOfString(IEnumerable<string> inputLines)
{
  // Will output: Lorem lipsum et

  List<string> outputLines = new List<string>();

  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;

}

答案 6 :(得分:0)

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

以下是扩展句子的扩展方法:

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()”开头,因此如果在字符串中找到的每个分隔符后面都会跟着另一个字符。 / p>

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

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

希望我能帮助别人!

答案 7 :(得分:0)

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

public static string ToTitleCase(string strX)
    {
        string[] aryWords = strX.Trim().Split(' ');

        List<string> lstLetters = new List<string>();
        List<string> lstWords = new List<string>();

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