我有一个输入字符串,我想验证它包含:

仅限信件或 只有字母和数字或者 只能使用字母、数字或下划线

为了澄清,我在代码中有3种不同的情况,每种情况调用不同的验证。用c#实现这个最简单的方法是什么?


当前回答

我还没有看到使用模式匹配的解决方案:

public static bool ContainsOnlyLetters(this string input)
{
    bool isValid = true;

    for (int i = 0; isValid && i < input.Length; i++)
    {
        isValid &= input[i] is >= 'A' and <= 'Z' or >= 'a' and <= 'z';
    }

    return isValid;
}

或者如果你真的非常讨厌可读的代码:

public static bool ContainsOnlyLetters(this string input)
{
    bool isValid = true;
    for (int i = 0; i < input.Length && (isValid &= input[i] is >= 'A' and <= 'Z' or >= 'a' and <= 'z'); i++);
    return isValid;
}

其他回答

你可以循环字符串的字符,并使用字符方法IsLetter检查 但是你也可以使用String方法IndexOfAny来搜索其他不应该在字符串中的字符。

使用它扫描字符串的每个字符。

如果你想包含除“SPACE”之外的“许多”字符,你可以在1个IF语句后添加SWITCH语句。

string myInput = string.Empty;
bool check = false; 

// Loops the input module
while (check is false)
{
    Console.WriteLine("Enter Letters Only");
    myInput = Console.ReadLine();

    // Loops the SCANNING PROCCESS of each character of the string
    for (int i = 0; i < myInput.Length; i++)                  
    {
        // Prints current scanning proccess 1 by 1(character by character) inside the string
        Console.WriteLine("Checking Character \"{0}\" ",myInput[i]);
        
        // Letters only     
        if (Char.IsLetter(myInput[i]))
        {
            check = true;
        }
        
        // Includes "SPACE" character
        else if (myInput[i] == ' ')
        {
            check = true;
        }
        else
        {
            check = false;
            Console.WriteLine("wrong input. \"{0}\" is not a string", myInput[e]);
            Console.WriteLine("pls try again");
            // Exits from loop of scanning proccess due to unwanted input
            break;        
        }  
    }
    // Ends SCANNING of 1 CHARACTER inside the string
} 
Console.WriteLine("Input Approved: \"{0}\"", myInput);
Console.WriteLine("Press any key to exit");
Console.ReadKey();

输出:错误输入

只输入字母 代理47 检查字符“A” 检查字符“g” 检查字符“e” 检查字符“n” 检查字符“t” 检查字符" " 检查字符“4” 哦。“4”不是有效输入 请再试一次 只输入字母

输出:无错误输入

只输入字母 特工47 检查字符“A” 检查字符“g” 检查字符“e” 检查字符“n” 检查字符“t” 检查字符" " 检查字符“F” 检查字符“o” 检查字符“r” 检查字符“t” 检查字符“y” 检查字符" " 检查字符“S” 检查字符“e” 检查字符“v” 检查字符“e” 检查字符“n” 批准输入:“47号特工” 按任意键退出

或SWITCH语句,如果你只想包括“一些”字符从字母类别和“一些”字符从数字类别。

switch (myInput[e])
{ 
    case 'a':
    case 'b':
    case 'c':
    case 'd': 
    case '1':
    case '2':
    case '3':
    case '!':
    case '@': 
    case '#':  
        check = true;
        break; 
    default:
        check = false;
        Console.WriteLine("Oops, \"{0}\" is not a string", myInput[i]);
        Console.WriteLine("pls try again\n");
        break;
}
if (check == false) break ;

只有字母:

Regex.IsMatch(input, @"^[a-zA-Z]+$");

仅限字母和数字:

Regex.IsMatch(input, @"^[a-zA-Z0-9]+$");

只有字母、数字和下划线:

Regex.IsMatch(input, @"^[a-zA-Z0-9_]+$");

请找到验证字符是字母、数字还是空格的方法,否则附加下划线 (可根据需要随意修改)

public String CleanStringToLettersNumbers(String data)
{
    var result = String.Empty;

    foreach (var item in data)
    {
        var c = '_';

        if ((int)item >= 97 && (int)item <= 122 ||
            (int)item >= 65 && (int)item <= 90 ||
            (int)item >= 48 && (int)item <= 57 ||
            (int)item == 32)
        {
            c = item;
        }

        result = result + c;
    }

    return result;
}

我还没有看到使用模式匹配的解决方案:

public static bool ContainsOnlyLetters(this string input)
{
    bool isValid = true;

    for (int i = 0; isValid && i < input.Length; i++)
    {
        isValid &= input[i] is >= 'A' and <= 'Z' or >= 'a' and <= 'z';
    }

    return isValid;
}

或者如果你真的非常讨厌可读的代码:

public static bool ContainsOnlyLetters(this string input)
{
    bool isValid = true;
    for (int i = 0; i < input.Length && (isValid &= input[i] is >= 'A' and <= 'Z' or >= 'a' and <= 'z'); i++);
    return isValid;
}