如何将每个句子的第一个字符大写

时间:2017-11-16 18:45:06

标签: c#

使用接受字符串作为参数的方法创建应用程序,并返回字符串的副本,每个句子的第一个字符大写。

这就是我所要做的,我似乎无法做到正确:

    //Create method to process string.
    private string Sentences(string input)
    {
        //Capitalize first letter of input.
        char firstLetter = char.ToUpper(input[0]);

        //Combine the capitalize letter with the rest of the input.
        input = firstLetter.ToString() + input.Substring(1);

        //Create a char array to hold all characters in input.
        char[] letters = new char[input.Length];

        //Read the characters from input into the array.
        for (int i = 0; i < input.Length; i++)
        {
            letters[i] = input[i];
        }

        //Loop through array to test for punctuation and capitalize a character 2 index away.
        for (int index = 0; index < letters.Length; index++)
        {
            if(char.IsPunctuation(letters[index]))
            {
                if (!((index + 2) >= letters.Length))
                {
                    char.ToUpper(letters[index+ 2]);
                }
            }
        }

        for(int ind = 0; ind < letters.Length; ind++)
        {
            input += letters[ind].ToString();
        }

        return input;
    }

5 个答案:

答案 0 :(得分:0)

我建议使用正则表达式来识别句子中的所有点。获取匹配,将其设为大写,并在匹配索引中将其替换回原始句子中。我实际上没有任何IDE在.NET上尝试代码,但我可以用伪代码编写它以便更好地理解。

    String setence = "your.setence.goes.here";
    Regex rx = new Regex("/\..*?[A-Z]/");
    foreach (Match match in rx.Matches(sentence))
    {
        setence.remove(match.Index, 2).insert(match.Index, String.ToUpper(match.Value));
    }

答案 1 :(得分:0)

您可以使用Linq.Aggregate n - 请参阅代码和代码输出中的注释,以了解其工作原理。

这个人会尊重&#34; Bla。 blubb&#34;同样 - 你需要在&#34;。?!&#34;

之后检查空格
using System;
using System.Linq;

internal class Program
{
    static string Capitalize(string oldSentence )
    {
        return

            // this will look at oldSentence char for char, we start with a
            // new string "" (the accumulator, short acc)
            // and inspect each char c of oldSentence

            // comment all the Console.Writelines in this function, thats 
            // just so you see whats done by Aggregate, not needed for it to 
            // work

            oldSentence 
            .Aggregate("", (acc, c) =>
             {
                 System.Console.WriteLine("Accumulated: " + acc);
                 System.Console.WriteLine("Cecking:     " + c);

                 // if the accumulator is empty or the last character of 
                 // trimmed acc is a ".?!" we append the
                 // upper case of c to it
                 if (acc.Length == 0 || ".?!".Any(p => p == acc.Trim().Last())) // (*)
                     acc += char.ToUpper(c);
                 else
                     acc += c; // else we add it unmodified

                 System.Console.WriteLine($"After:      {acc}\n");

                 return acc; // this returns the acc for the next iteration/next c                  
            });
    }

    static void Main(string[] args)
    {
        Console.SetBufferSize(120, 1000);
        var oldSentence = "This is a testSentence. some occurences "
            + "need capitalization! for examlpe here. or here? maybe "
            + "yes, maybe not.";

        var newSentence = Capitalize(oldSentence);

        Console.WriteLine(new string('*', 80));
        Console.WriteLine(newSentence);
        Console.ReadLine();
    }
}

(*)

  • ".?!".Any(p => p == ... ))表示字符串".?!"包含任何等于...的字符
  • acc.Trim().Last()表示:删除acc前面/后面的空格并给我最后一个字符

.Last().Any()也是Linq。大多数Linq-esc扩展程序都可以在此处找到: https://msdn.microsoft.com/en-us/library/9eekhta0(v=vs.110).aspx

输出(剪断 - 相当长; o)

Accumulated:
Cecking:     T
After:      T

Accumulated: T
Cecking:     h
After:      Th

Accumulated: Th
Cecking:     i
After:      Thi

Accumulated: Thi
Cecking:     s
After:      This

Accumulated: This
Cecking:
After:      This

Accumulated: This
Cecking:     i
After:      This i

Accumulated: This i
Cecking:     s
After:      This is

<snipp - .. you get the idea how Aggregate works ...>

Accumulated: This is a testSentence.
Cecking:     s
After:      This is a testSentence. S

<snipp>

Accumulated: This is a testSentence. Some occurences need capitalization!
Cecking:     f
After:      This is a testSentence. Some occurences need capitalization! F

<snipp> 
********************************************************************************
This is a testSentence. Some occurences need capitalization! For examlpe here. Or here? Maybe yes, maybe not.

答案 2 :(得分:0)

您有两项任务:

1)将文本拆分成句子 2)将句子中的第一个字符大写

任务1可能非常复杂,例如因为那里有很多疯狂的语言。因为这是家庭作业,我认为你可以继续前进,只需通过众所周知的分隔符进行分割。

任务二是基本的字符串操作。您选择第一个字符,将其设为大写,并通过子字符串操作添加句子的缺失部分。

这是一个代码示例:

char[] separators = new char[] { '!', '.', '?' };
string[] sentencesArray = "First sentence. second sentence!lastone.".Split(separators, StringSplitOptions.RemoveEmptyEntries);
var i = 0;
Array.ForEach(sentencesArray, e =>
{
 sentencesArray[i] = e.Trim().First().ToString().ToUpper() + 
 e.Trim().Substring(1);
 i++;
 });

答案 3 :(得分:0)

我已经在Groovy中为同一方法创建了一个方法

String capitalizeFirstCharInSentence(String str) {
    String result = ''
    str = str.toLowerCase()
    List<String> strings = str.tokenize('.')
    strings.each { line ->
        StringBuilder builder = new StringBuilder(line)
        int i = 0
        while (i < builder.size() - 1 && !Character.isLowerCase(builder.charAt(i))) {
            i++
        }
        if (Character.isLowerCase(builder.charAt(i))) {
            builder.setCharAt(i, builder.charAt(i).toUpperCase())
            result += builder.toString() + '.'
        }
    }
    return result
}

答案 4 :(得分:0)

我喜欢您格式化方法的方式,因为它使新的编码人员可以轻松阅读,因此我决定尝试在保持结构的同时使代码正常工作。我看到的主要问题是,格式化数组后您没有替换数组。

//Create method to process string.
private string Sentences(string input)
{
    //Create a char array to hold all characters in input.
    char[] letters = new char[input.Length];

    //Read the characters from input into the array.
    for (int i = 0; i < input.Length; i++)
    {
        letters[i] = input[i];
    }

    //Capitalize first letter of input.
    letters[0] = char.ToUpper(letters[0]);

    //Loop through array to test for punctuation and capitalize a character 2 index away.
    for (int index = 0; index < letters.Length; index++)
    {
        if(char.IsPunctuation(letters[index]))
        {
            if (index + 2 <= letters.Length)
            {
                letters[index + 2] = char.ToUpper(letters[index+ 2]);
            }
        }
    }

    // convert array back to string
    string results = new string(letters)
    return results;
}