簡體   English   中英

如何將每個句子的第一個字符大寫

[英]How to capitalize the first character of every sentence

使用接受字符串作為參數的方法創建應用程序,並返回字符串的副本,其中每個句子的第一個字符都大寫。

這就是我必須做的事情,但我似乎無法做到:

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

我建議使用正則表達式來識別句子中的所有點。 獲取匹配項,將其設為大寫,然后在匹配索引中將其替換回原始句子中。 我現在實際上沒有任何可以在 .NET 上嘗試代碼的 IDE,但我可以用偽代碼編寫它以便更好地理解。

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

您可以使用Linq.Aggregate n - 請參閱代碼和代碼輸出中的注釋以了解其工作原理。

這個也會尊重“Bla. blubb”——你需要在“.?!”之后檢查空格。

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.

你有兩個任務:

1) 將文本拆分成句子 2) 將句子中的第一個字符大寫

任務一可能非常復雜,例如因為那里有很多瘋狂的語言。 既然這是作業,我假設您可以繼續並簡單地按眾所周知的分隔符拆分。

任務二只是基本的字符串操作。 您選擇第一個字符,使其大寫,然后通過子字符串操作添加句子的缺失部分。

這是一個代碼示例:

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

我在 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
}

我喜歡你格式化方法的方式,因為它使新的編碼人員更容易閱讀,所以我決定嘗試在保持結構的同時使代碼工作。 我看到的主要問題是您在格式化數組后沒有替換它們。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM