C#检查字符串是否为ABC123类型

时间:2013-04-21 13:34:37

标签: c# visual-studio-2010

我想检查字符串是否为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");
        }
    }

6 个答案:

答案 0 :(得分: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} $' - “前三个字符必须是字母”

答案 1 :(得分: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()来验证字符串作为航班代码,只要您导入了上述类所在的命名空间(并且Visual Studio中有几个附加组件可以执行此操作)这会自动为您服务。

答案 2 :(得分:0)

在长度检查之前,您还可以进行空检查,具体取决于此函数的输入方式。

另一方面,我个人觉得消息框很烦人。可能更好用文本框旁边的某种标签代替显示错误。

答案 3 :(得分:0)

据我所知,您还希望能够向用户提供有关错误的反馈意见吗? 就个人而言,我可能会在一个正则表达式中测试所有这些条件,就像上面发布的那样。然后,如果它失败了,我会测试其他表达式的数量以获得失败的原因。我对正则表达式比对某些测试迭代更信任。

答案 4 :(得分:0)

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

进行改进: *你可以跳过正则表达式,因为你会做char.IsLetter。您还可以为第二个3个字符添加char.IsLetterOrDigit(如果这些字符必须为数字,则为char.IsDigit) *当你的失败时,也可以删除'else'分支并抛出一条错误信息,并提供一般所需的格式(“航班代码必须是6个字符长,3个数字和3个数字,如ABC123”)。这样你就可以加快一点,因为你只会测试一次值(if-then-else)

答案 5 :(得分:0)

使用以下代码仅匹配字符串的最后三个字符:

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