2015-09-22 66 views
-1

我是c#的初学者,我怎么能写一个代码,检查是否: 前3个字符是字母 接下来3个是数字, 下两个字母 并且最后一个字符是数字。 如果是不写错误信息。子串和Char.Is/Number混淆。

我试过使用子字符串(0,3),并把它对Char.IsLetter只是为了尝试但失败。

+2

您可以使用正则表达式 – Arash

+0

当您说“字母”时,您的意思是一个Unicode字母吗?作为'Char.IsLetter'检查? – Magnus

+0

只是要清楚你的意思是一个9个字符的字符串。而不是以3个字母,3个数字,2个字母以及任意数量的字符开头的字符串,只要最后一个字符是数字。 – juharr

回答

2

下面是使用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字符(分数,下标,上标,罗马数字,货币numerators,圆圈内的编号,和脚本 - 具体数字)。此外,char.IsLetter也将匹配任何被认为是偏离基本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字符,并根据该字符使用正确的正则表达式。

+1

@ L.B什么答案?我并不是说任何其他答案都是错的,只是这就是你如何使用'char.IsLetter'和'char.IsNumber'来完成的。 – juharr

+0

嘿,别担心......我认为@LB刚刚从床上起床:) – Rahul

+0

我们不知道字符串的长度 – ivg

2

你可以使用正则表达式

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

这也会匹配“!!!! abc123de4 $$$$”,因为没有锚。 – juharr

2

你可以只使用正则表达式:

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); 
+0

@Rahul我意识到这一点,但我认为用这种方式写得更加简洁。感谢您的评论,我会将其纳入我的回答。 – Christos

+0

这不会真的检查它是否是一个Unicode字母。如果这是操作的意图。 – Magnus

1

您可以访问字符串的单个字符在C#这样的:

string s = "1test"; 

char c = s[0]; 

Ç会那么“1”之一。

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

if(c.IsNumber()){} 

然后你做,除了你使用Char.IsLetter方法接下来的两个字符同样的事情。

+2

虽然我认为正则表达式可能是一个更优雅的解决方案,但这种方法对初学者来说更容易理解。 –

+1

是的告诉初学者使用正则表达式不是一个好主意。 – lassedev

+1

@LasseKlüver:我的想法! – code4life

1

我认为有几种优雅的方式来做到这一点。既然你说你是一个初学者到C#,我建议只找最简单的(最伪码样,恕我直言)的方式,只是表达问题/解决方案:

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!"); 
    } 
} 
+0

更好地添加一个测试,该字符串的长度为9,否则最终可能会验证更长的字符串并为较短的字符串获取例外。 – juharr

+0

我故意留下了(注意'.Last()'),LOL。这个数字模式是我应该认识的吗?我刚才所说的问题完全可以解决,也许这是错误的? – code4life

+0

OP确实说了_并且最后一个字符是数字_但它似乎可能是第9个字符。即使这不是他们的意思,你仍然会在长度小于8的字符串上崩溃。 – juharr