2013-04-21 32 views
1

我想检查一个字符串是否属于ABC123类型。C#检查字符串是否属于ABC123

  • 字符串的长度必须是6
  • 只有字母和数字是允许的。
  • 字符串的前三个值必须是字母。

这就是我所做的。我如何改进代码?

private void ValidationOfFlightCode(string flightCode) 
    { 
     if (flightCode.Length == 6) 
     { 
      bool state = Regex.IsMatch(flightCode, @"^[a-zA-Z0-9]+$"); 
      if (state) 
      { 
       bool isLetter = false; 
       for (int i = 0; i < 3; i++) 
       { 
        isLetter = Char.IsLetter(flightCode, i); 
        if (!isLetter) 
         break; 
       } 
       if (isLetter) 
       { 
        MessageBox.Show(flightCode + ": " + state); 
       } 
       else 
       { 
        MessageBox.Show("The letters must be before the numbers"); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Only letters and numbers are allowed!"); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Flight Code must be 6 characters long"); 
     } 
    } 
+1

你是否需要针对每个错误的特定错误消息?否则,这个正则表达式将完成这项工作:'[A-Z] {3} [A-Z0-9] {3}'。 – alexn 2013-04-21 13:35:56

回答

5

这个正则表达式应该工作:

^[a-zA-Z]{3}[a-zA-Z0-9]{3}$ 
//^ ^ ^ ^
// |  |  |  | 
// |  |  |  +-- Three times 
// |  |  +--------- Letters or digits 
// |  +---------------- Three times 
// +---------------------- Only letters 

如果IsMatch在这个表达式返回false,你可以做进一步的验证,看看有什么是错的。

我该如何改进代码?

您可以创建一组正则表达式和错误消息。每个正则表达式应该比前一个更具限制性。浏览列表,并尝试将代码与正则表达式进行匹配。如果有没有匹配,则打印错误消息并退出循环。例如,你可以这样做:

  • ^.{6}$ - “的代码必须包含六个字符”
  • '^ [A-ZA-Z0-9] {6} $' - “字符必须是alhpanumeric “
  • '^ [A-ZA-Z] {3} {3} $。' - ”前三个字符必须是字母“
+0

如果我只想要最后三个字符中的数字,那么正则表达式是什么? – EM10 2013-04-21 13:44:38

+2

^[a-zA-Z] {3} [0-9] {3} $ – 2013-04-21 13:46:34

0

在长度检查之前,您还可以执行空检查,具体取决于此函数如何获取其输入。

在附注上,我个人发现Messages框令人讨厌。它可能会更好有一些标签旁边的文本框,而不是显示错误。

0

我明白,你也想保持一个可能性给用户一个关于错误的反馈? 我个人可能会在一个正则表达式中测试所有这些条件,就像上面发布的那样。然后,如果它失败了,我会测试其他表达式的数量来获得失败的原因。我比正则表达式更信任一些测试迭代。

1

如果您不需要对发生什么错误有如此具体的描述,那么您可以编写一个能够一次捕获整个规范的正则表达式。我假设表单总是AAAXXX,即三个字母和三位数字(最后三个字符中绝不会有一个字母),但如果字母在那里也很容易适应。

bool isOK = Regex.IsMatch(flightCode, @"^[a-zA-Z]{3}[0-9]{3}$"); 

该正则表达式还强加字符的排序和字符串的总长度。不过,我会再进一步​​,这样做,因为在string类型的扩展方法:

public static class FlightCodeValidationExtensions { 
    public static bool IsValidFlightCode(this string str) { 
     return Regex.IsMatch(flightCode, @"^[a-zA-Z]{3}[0-9]{3}$"); 
    } 
} 

现在,你可以通过简单地调用str.IsValidFlightCode()验证字符串作为flightcode,只要你已经导入了命名空间其中,上述类位于(有几个附加组件到Visual Studio将自动为您做到这一点。

0
  • 怎么样二号3个字符?你没有测试这些
  • 1日3必须“美国信件”?不能是任何其他语言环境?(如“é”,或中文/日文/希伯来文/等)

用于改进: *您可以跳过正则表达式,因为无论如何您都会执行char.IsLetter。你也可以为第二个3个字符添加char.IsLetterOrDigit(或者char.IsDigit,如果这3个字符必须是数字的话) *也可以删除'else'分支,并在你的for失败时抛出一个错误信息,并给出所需的格式一般来说(“飞行代码必须是6个字符长,3个数字& 3个数字,如ABC123”)。这样可以加快一点,你只会测试值一次(IF-THEN-ELSE)

0

使用下面的代码只有一个字符串的最后三个字符匹配:

bool isMatch = Regex.IsMatch("flightCode", @"[a-zA-Z0-9]{3}$");