Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确保用户在C中输入正确的字符类型?_C# - Fatal编程技术网

C# 如何确保用户在C中输入正确的字符类型?

C# 如何确保用户在C中输入正确的字符类型?,c#,C#,任务是创建一段代码,用户必须在其中输入其邮政编码。它必须是字母+数字+字母+空格+数字+字母+数字。它最多需要7个字符,如果用户没有输入正确的类型字符,则需要使用if语句来验证并发布错误。例如:A2B 1C3 string postalCode; Console.WriteLine("Enter Your Postal Code"); postalCode = Console.ReadLine(); if (postalCode.Length == 7) { Console.Write

任务是创建一段代码,用户必须在其中输入其邮政编码。它必须是字母+数字+字母+空格+数字+字母+数字。它最多需要7个字符,如果用户没有输入正确的类型字符,则需要使用if语句来验证并发布错误。例如:A2B 1C3

string postalCode;
Console.WriteLine("Enter Your Postal Code");
postalCode = Console.ReadLine();

if (postalCode.Length == 7)
{
    Console.WriteLine("Your Postal Code is " + postalCode);
}
else
{
    Console.WriteLine("Error invalid Postal Code");
}

Console.ReadKey();

我不同意你应该使用正则表达式。使用简单易读的代码就可以很容易地解决这个问题,不需要过于复杂

首先,正如您已经做的,您可以很容易地获得字符串的长度。如果是有效长度,那么只需检查字符串中的每个字符是否有效。可以使用中的和方法检查字符串中的任何给定字符是否为数字或字母。您可以编写如下方法:

public bool IsValidPostcode(string postcode)
{
    return postcode.Length == 7
        && char.IsLetter(postcode[0]) 
        && char.IsLetter(postcode[2]) 
        && char.IsLetter(postcode[5])
        && char.IsDigit(postcode[1]) 
        && char.IsDigit(postcode[4]) 
        && char.IsDigit(postcode[6])
        && postcode[3] == ' ';
}
在您的示例中使用以下内容:

if (IsValidPostcode(postalCode))
{
    Console.WriteLine("Your Postal Code is " + postalCode);
}
else
{
    Console.WriteLine("Error invalid Postal Code");
}
如果您想通过Regex解决这个问题,您可以通过以下方式实现相同的效果:

bool validPostCode = Regex.Match(postalCode, @"^[a-zA-Z]\d[a-zA-Z] \d[a-zA-Z]\d$").Success;
编辑

如果IsDigit和Isleter的约束不合适,OP还可以建立一个允许字符列表,并对照该列表进行检查:

public static bool IsValidPostcode(string postcode)
{
    char[] validLetters = Enumerable.Range('a', 'z' - 'a' + 1)
        .Concat(Enumerable.Range('A', 'Z' - 'A' + 1))
        .Select(c => (char)c).ToArray();
    char[] validNumbers = Enumerable.Range('0', 10).Select(c => (char)c).ToArray();

    return postcode.Length == 7
        && validLetters.Contains(postcode[0])
        && validLetters.Contains(postcode[2])
        && validLetters.Contains(postcode[5])
        && validNumbers.Contains(postcode[1])
        && validNumbers.Contains(postcode[4])
        && validNumbers.Contains(postcode[6])
        && postcode[3] == ' ';
}

显然,Validleters和ValidNumber与构建once类成员更为合适,但为了便于说明,我将它们放在了方法中。

查看正则表达式。您可以创建一个与该序列匹配的表达式,并根据该表达式测试输入。确切的问题是什么?请注意,Isleter和IsDigit可能重复使用Unicode字符属性,这可能不是您想要的。您的代码块相当于regex^\p{L}\d\p{L}\d\p{L}\d$。Asker可能想要^\[a-zA-Z][0-9][a-zA-Z][0-9][a-zA-Z][0-9]$公正的评论-如果是这种情况,请参阅我的编辑以获得等效的解决方案。是的,这应该有效,尽管我认为现在使用正则表达式会更简单易读:如果您确实想通过代码实现这一点,那么编写两个帮助函数(如static bool IsAsciiLetterthis char c=>a)会更容易