子字符串和Char./数字混乱

本文关键字:数字 混乱 Char 字符串 | 更新日期: 2023-09-27 18:13:56

我是c#的初学者,我怎么写一个代码来检查:前3个字符是字母接下来的三个是数字,接下来的两封信最后一个字符是数字。如果不是,则写一条错误消息。

我试过使用Substring(0,3)并把它放在Char上。我只是想尝试一下,但失败了。

子字符串和Char./数字混乱

以下是使用char.IsLetterchar.IsNumber的正确方法。

if(myString.Length == 9
    && char.IsLetter(myString[0])
    && char.IsLetter(myString[1])
    && char.IsLetter(myString[2])
    && char.IsNumber(myString[3])
    && char.IsNumber(myString[4])
    && char.IsNumber(myString[5])
    && char.IsLetter(myString[6])
    && char.IsLetter(myString[7])
    && char.IsNumber(myString[8]))
{
    // match.
}

基本上你已经验证了字符串的长度,然后验证每个字符。

您还可以使用char.IsDigit将匹配限制为基数10位数字,而char.IsNumber将匹配任何被视为数字的Unicode字符(分数、下标、上标、罗马数字、货币分子、包围数字和特定于脚本的数字)。此外,char.IsLetter还将匹配任何被视为字母的Unicode字符,这些字符将偏离基本的a - z。要将数字限制为0-9,字母限制为A-Z,您可以这样做。

public static IsAtoZ(char c)
{
    return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
}
if(myString.Length == 9
    && IsAtoZ(myString[0])
    && IsAtoZ(myString[1])
    && IsAtoZ(myString[2])
    && char.IsDigit(myString[3])
    && char.IsDigit(myString[4])
    && char.IsDigit(myString[5])
    && IsAtoZ(myString[6])
    && IsAtoZ(myString[7])
    && char.IsDigit(myString[8]))
{
    // match.
}

但是老实说,在这一点上正则表达式会更简洁。但是请注意,您仍然需要考虑是否要匹配Unicode字符并基于此使用正确的正则表达式。

你可以使用正则表达式

bool isMatch= Regex.IsMatch("abc123de4", @"'p{L}{3}'d{3}'p{L}{2}'d");

您可以使用正则表达式:

var regex = new Regex("^[a-z]{3}[0-9]{2}[a-z]{2}[0-9]{1}$", RegexOptions.IgnoreCase);
var matces = regex.Matches(input);

其中input是要检查的字符串。

当我们将选项RegexOptions.IgnoreCase传递给Regex的构造函数时,我们说字母是否大写并不重要。

你可以避免指定这个参数,并明确地声明你想要大写和小写字母,正如Rahul在他的评论中正确指出的那样。如下所示:

var regex = new Regex("^[a-z][A-Z]{3}[0-9]{2}[a-z][A-Z]{2}[0-9]{1}$");
var matces = regex.Matches(input);

在c#中可以这样访问字符串中的单个字符:

string s = "1test";
char c = s[0];

c将是'1' 1。

在下一步中,您可以使用Char。IsNumber返回bool值的方法。就像这样:

if(c.IsNumber()){}

然后对接下来的两个字符执行相同的操作,只是使用Char。胰岛方法。

我认为有几种优雅的方法可以做到这一点。既然你说你是c#的初学者,我建议你找到最简单的(最像伪代码的,IMHO)方式来表达问题/解决方案:

private bool MatchesPattern(string test)
{
    // can't possibly match the pattern with less than 9 chars
    if (test.Length < 9) return false;

    int idx = 0;
    // test are letters
    for (int steps = 1; steps <= 3; steps++)
    {
        if (!char.IsLetter(test[idx++])) return false;
    }
    // test are numbers
    for (int steps = 1; steps <= 3; steps++)
    {
        if (!char.IsNumber(test[idx++])) return false;
    }
    // test are letters
    for (int steps = 1; steps <= 2; steps++)
    {
        if (!char.IsLetter(test[idx++])) return false;
    }
    // test last char is number
    if (!char.IsNumber(test.Last())) return false;
    return true;
}

您可以测试结果:

private void Test(string testValue)
{
    if (!MatchesPattern(testValue))
    {
        Console.WriteLine("Error!");
    }
}