1

I want to check if a string is of type ABC123.

  • The length of the string must be 6.
  • Only letters and numbers are allowed.
  • The first three values of the string must be letters.

This is what I have done. How can I improve the code?

    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");
        }
    }
4

6 回答 6

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}$' - "字符必须是字母数字"
  • '^[[a-zA-Z]{3}.{3}$' - “前三个字符必须是字母”
于 2013-04-21T13:38:07.517 回答
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 中有几个附加组件会自动为您执行此操作。

于 2013-04-21T13:46:39.807 回答
0

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

bool isMatch = Regex.IsMatch("flightCode", @"[a-zA-Z0-9]{3}$");
于 2013-04-21T14:41:55.573 回答
0

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

于 2013-04-21T13:42:22.863 回答
0

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

在旁注中,我个人觉得消息框很烦人。在显示错误的文本框旁边使用某种标签可能会更好。

于 2013-04-21T13:37:55.427 回答
0
  • 第二个3个字符怎么样?你不测试那些
  • 第一个 3 必须是“美国字母”?不能是任何其他语言环境?(如“é”,或中文/日文/希伯来文/等)

改进: * 你可以跳过正则表达式,因为你会做 char.IsLetter 无论如何。您还可以为第二个 3 个字符添加 char.IsLetterOrDigit(如果这 3 个必须是数字,则为 char.IsDigit)* 也可以在您的 for 失败时剪切“else”分支并抛出一条错误消息,并给出所需的格式一般(“航班代码必须为 6 个字符长、3 位数字和 3 个数字,例如 ABC123”)。这样你可以加快一点,因为你只会测试一次值(if-then-else)

于 2013-04-21T13:50:39.363 回答