簡體   English   中英

驗證用戶僅輸入一個單詞的答案,並且首字母大寫

[英]Validating user only enters a one word answer and that the first letter is capitalized

我目前正在自學C#,並且對它掌握得相當不錯,但是我迷失在如何驗證用戶僅輸入一個單詞答案以及是否大寫的方式上,否則我想給他們另一個機會嘗試。

這是我到目前為止所擁有的:

static void Main(string[] args)
    {
        //assigned variable
        string userInput;
        //intializing empty string
        string answerInput = string.Empty;
        //Creating loop
        while ((answerInput == string.Empty) || (answerInput == "-1"))
        {
            //This is asking the question to the user
            Console.WriteLine("Enter your favorite animal: ");
            //this is storing users input
            userInput = Console.ReadLine();
            //using function to validate response
            answerInput = letterFunc(userInput);
        }


    }
    //Creating function to only allow letters and making sure it's not left blank.
    private static string letterFunc (string validate)
    {
        //intializing empty string
        string returnString = string.Empty;
        //validating it is not left empty
        if(validate.Length > 0)
        {
           //iterating through the passed string
           foreach(char c in validate)
            {
                //using the asciitable to validate they only use A-Z, a-z, and space
                if ((((Convert.ToInt32(c)) > 64) && ((Convert.ToInt32(c)) < 91)) || (((Convert.ToInt32(c)) > 96) && ((Convert.ToInt32(c)) < 123)) || (Convert.ToInt32(c) == 32))
                {
                    //appensing sanitized character to return string
                    returnString += c;
                }
                else
                {
                    //If they try to enter a number this will warn them
                    Console.WriteLine("Invalid input. Use letters only.");
                }
            }
        }
        else
        {
            //If user enters a blank input, this will warn them
            Console.WriteLine("You cannot enter a blank response.");
        }
        //returning string
        return returnString;
    }

我想知道是否有可能在我創建的用於驗證他們僅使用字母的函數中進行操作,並且通過詳細說明它不會為空。 謝謝。

正則表達式並不難。 問題是有時候您想實現更復雜的目標,但事實並非如此:

private static string letterFunc (string validate)
{
    return new Regex("^[A-Z][a-z]*$").IsMatch(validate) ? 
           validate :
           string.Empty;
}

解釋表達式:

^ -錨點:僅在文本表達式開頭時匹配

[AZ] -正確的一個字符,從AZ

[az]* -零個或多個字符,從az

$ -錨點:僅當文本以表達式結尾時才匹配

通過使用兩個錨點,我們希望全文匹配表達式,而不是表達式的一部分。

如果要在第一個字母(例如, CaTDoG )之后使用大寫字母,可以將其更改為:

^[AZ][a-zA-Z]*$

使用Regex玩: https : //regex101.com/r/zwLO6I/2

正則表達式將是執行此操作的標准方法,但是查看您的代碼,我認為您還沒有准備好使用它們。 順便說一句,這不是侮辱-每個人在某個時候都是初學者!

每當您遇到這樣的問題時,首先要確保所有要求都定義明確且具體:

  • 單字答案:在代碼中,您已將其定義為“僅包含字母和空格的答案”。 這可能並不理想,因為它阻止人們輸入像dik-dik這樣的答案作為他們最喜歡的動物。 但是,讓我們暫時堅持下去。

  • 大寫答案:我們將其定義為“第一個字符為大寫字母的答案”。

因此,將這兩個要求放在一起,我們正在嘗試驗證答案是否以大寫字母開頭並且僅包含字母和空格。

在編碼時,請查看您使用的語言和框架,以查看是否有方便的方法可以為您提供幫助。 .NET有很多此類功能。 我們知道我們將必須檢查String的各個字符,並且字符串是由Char的,因此讓我們搜索“ c#char type”。 查看MSDN頁面上的System.Char ,我們可以看到一些可以幫助我們的方法:

  • Char.IsWhiteSpace測試字符是否為“空白”(空格,制表符,換行符)
  • Char.IsLetter測試字符是否為字母。
  • Char.IsUpper測試字符是否為大寫字母。

因此,讓我們再次看一下我們的需求並一次實現一個需求:“以大寫字母開始,僅包含字母和空格”。

讓我們將其稱為用戶輸入字符串answer 我們可以檢查第一個字母是否為大寫字母(請注意,我們還要確保它具有第一個字母):

bool isCapitalized = answer.Length > 0 && Char.IsUpper( answer[0] );

我們可以檢查它是否僅包含字母和空格,如下所示:

bool containsOnlyLettersAndSpaces = true;
foreach( char c in answer )
{
    if( !Char.IsLetter( c ) && !Char.IsWhiteSpace( c ) )
    {
        containsOnlyLettersAndSpaces = false;
        break;
    }
}

containsOnlyLettersAndSpaces從true開始。 然后,我們查看字符串中的每個字符。 如果找到的字符不是字母也不是空格,則將containsOnlyLettersAndSpaces設置為false。 另外,如果發現無效字符,請停止檢查。 我們知道答案現在無效,沒有理由檢查其余內容!

現在,我們可以結合兩個驗證來返回答案:

return isCapitalized && containsOnlyLettersAndSpaces;

這是整個方法:

    private bool IsValidAnimal( string answer )
    {
        bool isCapitalized = answer.Length > 0 && Char.IsUpper( answer[0] );

        bool containsOnlyLettersAndSpaces = true;
        foreach( char c in answer )
        {
            if( !Char.IsLetter( c ) && !Char.IsWhiteSpace( c ) )
            {
                containsOnlyLettersAndSpaces = false;
                break;
            }
        }

        return isCapitalized && containsOnlyLettersAndSpaces;
    }

祝您學習C#一切順利,我希望這可以幫助您考慮如何編碼!

我想到了。 感謝大家的幫助。

        string answer;
        while (true)
        {
            Console.WriteLine("Enter your favorite animal:");
            answer = Console.ReadLine();

            if (new Regex("^[A-Z][a-z]*$").IsMatch(answer))
            {
                Console.WriteLine("You like {0}s. Cool!", answer);
                Console.ReadKey();
                break;
            }
            else
            {
                Console.WriteLine("'{0}' is not a valid answer.", answer);
                Console.WriteLine();
                Console.WriteLine("Make sure:");
                Console.WriteLine("You are entering a one word answer.");
                Console.WriteLine("You are only using letters.");
                Console.WriteLine("You are capitalizing the first letter of the word.");
                Console.WriteLine();
                Console.WriteLine("Try again:");
            }

        }

暫無
暫無

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

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