Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使regex正确验证信息?_C#_Regex_Validation_Textbox - Fatal编程技术网

C# 如何使regex正确验证信息?

C# 如何使regex正确验证信息?,c#,regex,validation,textbox,C#,Regex,Validation,Textbox,我的任务是制作一个文本框,在其中输入我们拉脱维亚人使用的个人代码。我需要在保存信息之前对其进行验证。为了验证,我一直在使用正则表达式,但到目前为止没有得到任何结果 我们的个人代码如下:XXYYZZ-ABCDE,在哪里 xxyyz是日期格式,如DAYMONTHYEAR和ABCDE是随机数 if (per_kods.Text.Trim() != string.Empty) { mRegxExpression = new Regex("${day

我的任务是制作一个文本框,在其中输入我们拉脱维亚人使用的个人代码。我需要在保存信息之前对其进行验证。为了验证,我一直在使用正则表达式,但到目前为止没有得到任何结果

我们的个人代码如下:XXYYZZ-ABCDE,在哪里 xxyyz是日期格式,如DAYMONTHYEAR和ABCDE是随机数

        if (per_kods.Text.Trim() != string.Empty)
        {
            mRegxExpression = new Regex("${day}-${month}-${year}-#####$");

            if (!mRegxExpression.IsMatch(per_kods.Text.Trim()))
            {
                label7.Text = "";
            }
            else
            {
                label7.ForeColor = Color.Red;
                label7.Text = "Personas kods ievadīts nepareizi!";
                pareizi = false;
            }
        }

这是我的代码。它基本上在文本框上方启用一个标签,指出输入的信息是错误的。如果信息正确,标签将继续被禁用。但现在新的正则表达式部分是个问题。我知道这似乎完全错了,但我刚刚开始学习正则表达式,不知道什么是错的,什么是对的。

如果您不关心日期验证,例如2月31日将被接受,您可以这样做

new Regex(@"^(0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])(\d{2})-(\d{5})$");
如果您想了解这个字符串的含义,请查看

现在,对于日期验证,过滤掉不存在的日期,如310298,我建议您在之后手动进行-regex不是此类逻辑验证的最佳工具

public bool CheckValidation(string input)
    {
        input = input.Trim();
        if (input == string.Empty) return false;

        var mRegxExpression = new Regex("^([0-2][0-9]|(3)[0-1])(((0)[0-9])|((1)[0-2]))\\d{2}(\\-)\\d{5}$");
        return mRegxExpression.IsMatch(input);

    }
编辑:

您可以使用DateTime.TryParse来实现这一点

请注意,DateTime.TryParse对区域性敏感。根据目标区域性,您可能需要更改输入字符串。看

编辑2:

因此,要将其与现有代码连接:

mRegxExpression = new Regex(@"^(0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])(\d{2})-(\d{5})$");

var match = mRegxExpression.Match(per_kods.Text.Trim()));

if(!Validate(match))
{
    // Handle invalid.
}
else
{
    // Handle valid.
}
验证的位置是:

private static bool Validate(Match match)
{
    if(!match.Success)
    {
        return false;
    }

    var day = match.Groups[1].ToString();
    var month = match.Groups[2].ToString();
    var year = match.Groups[3].ToString();

    return DateTime.TryParse($"{day}-{month}-{year}", out _);
}

因为我们的正则表达式以^开头,以$结尾,所以最多只能有一个匹配项。Success属性告诉我们是否存在任何匹配,然后Groups属性给我们提供了捕获组。组[0]将是整个匹配的字符串,然后每个下一个组都将是与正则表达式中括号内的组之一匹配的子字符串-因此第一个组是0[1-9]|[1-2]\d | 3[0-1],表示天,第二个组是月,依此类推。然后我们只需再次检查日期是否有效,区分区域性!。此外,我们可以灵活地使用C7 discard语法作为out参数,因为我们不需要它。

您可以从下面的代码中获得帮助来检查验证

public bool CheckValidation(string input)
    {
        input = input.Trim();
        if (input == string.Empty) return false;

        var mRegxExpression = new Regex("^([0-2][0-9]|(3)[0-1])(((0)[0-9])|((1)[0-2]))\\d{2}(\\-)\\d{5}$");
        return mRegxExpression.IsMatch(input);

    }

能否显示有效和无效输入?有效部件的代码编写正确,因此未启用任何标签。无效部分的代码错误,因为我输入了24个月,这是错误的。当没有启用标签时,MessageBox会显示,但是应该有,因为个人代码编写不正确,但是我的正则表达式没有将其视为不正确,因此它不会启用if,从而使标签发出错误的信号。请将信息添加为文本,而不是屏幕截图。如果我正确理解C,则Regex类采用标准的Regex语法。因此,您需要^[0123]\d[01]\d\d\d-[A-Z]{5}$进行验证。我知道这是一个老话题,但他们在代码的第一部分中停止使用日期。最后一位数字是checksum用于此类逻辑验证的最佳工具是什么?编辑:由于某些原因,我的代码不理解该行中的\d。我使用DateTime.TryParse编辑了答案。是的,我忘记了正则表达式之前的@verbatim修饰符,也对它进行了编辑。你能告诉我如何将它连接到我已经编写的代码吗?它说在DateTime当前上下文中不存在名称“u”。TryParse${day}-{month}-{year},out;您确定是在启用C 7.0功能的情况下编译的吗?