C# 子字符串和Char.Is/Number混淆。

C# 子字符串和Char.Is/Number混淆。,c#,C#,我是c语言的初学者,如何编写代码来检查: 前3个字符是字母 接下来的3个是数字, 接下来的两封信 最后一个字符是数字。 如果不是,则编写错误消息 我尝试过使用Substring0,3并将其放在Char.isleter上尝试,但失败了 您可以使用正则表达式 bool isMatch= Regex.IsMatch("abc123de4", @"\p{L}{3}\d{3}\p{L}{2}\d"); 您可以只使用正则表达式: var regex = new Regex("^[a-z]{3}[0-9]{

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

我尝试过使用Substring0,3并将其放在Char.isleter上尝试,但失败了

您可以使用正则表达式

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);
其中输入是要检查的字符串

当我们将选项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];
if(c.IsNumber()){}
那么c将是“1”1

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

string s = "1test";

char c = s[0];
if(c.IsNumber()){}

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

下面是使用Char.isleter和Char.IsNumber的正确方法

基本上,您需要验证字符串的长度,然后验证每个字符

您还可以使用char.IsDigit将匹配限制为基数为10的数字,而char.IsNumber将匹配任何被视为数字分数、下标、上标、罗马数字、货币分子、环绕数字和脚本特定数字的Unicode字符。此外,char.isleter还将匹配任何被视为偏离基本a-Z之外的字母的Unicode字符。要将数字限制为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字符,并使用基于此的正确正则表达式,仍然需要考虑。

< P>我认为有几种优雅的方法来实现这一点。既然您说您是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;
}


@Rahul我知道这一点,但我认为用这种方式写的更简洁。谢谢你的评论,我会把它包括在我的答案中。但这并不能真正检查它是否是一个Unicode字母。如果这是op的意图。当你说字母时,你是指Unicode字母吗?当Char.isleter检查时?只是为了澄清一下,您指的是9个字符的字符串。而不是以3个字母、3个数字、2个字母开头的字符串,然后是任意数量的字符,只要最后一个字符是数字。如果是9个字符的字符串,那么第一个测试应该是value.Length==9。很简单。@L.B什么答案?我并不是说任何其他答案都是错误的,只是这就是使用char.isleter和char.IsNumber的方法。嘿,别担心。。。我想@L.B刚从床上起来:我们不知道绳子在哪里length@ivg这就是为什么我要检查它,因为如果OP想要3个字母,3个数字,2个字母,然后是一个数字,然后他们想要一个9个字符的字符串。最好添加一个测试,该字符串的长度为9,否则你可能会验证较长的字符串,并得到较短字符串的异常。我故意将其忽略。最后,LOL。这个数字模式是我应该识别的吗?我只是按照上面所说的方法来处理这个问题,也许这是错的?OP确实说最后一个字符是一个数字,但似乎它们是指第9个字符。即使这不是他们的意思,你仍然会在长度小于8的字符串上崩溃。这可能是我们想要的,对吗?如果长度小于8,我们不希望出现假阳性。此时抛出的异常是完全可以接受的。由于OP只提到了最后一个字符,而不是第九个字符,现在,我将保留我的答案。如果规格改变,肯定会改变。如果小于9,你可以而且可能应该返回false,那怎么会是假阳性呢?在这里避免例外似乎很明显。这也会匹配!!!!abc123de4$$$$,因为没有锚。虽然我认为正则表达式可能是一个更优雅的解决方案,但对于初学者来说,这种方法肯定更容易理解。是的,告诉初学者使用正则表达式不是一个好主意。@LasseKlüver:我的想法完全正确!