如何使正则表达式正确验证信息?

时间:2018-10-07 12:22:03

标签: c# regex validation textbox

我被赋予了创建一个文本框的任务,您可以在其中输入个人密码(我们在拉脱维亚使用的方式)。保存信息之前,我需要先对其进行验证。为了进行验证,我一直在使用Regex,但到目前为止没有任何结果。

我们的个人密码如下:XXYYZZ-ABCDE,其中 XXYYZZ是日期格式,如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;
            }
        }

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

2 个答案:

答案 0 :(得分:1)

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

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

如果您想了解此字符串的含义,请查看the MSDN reference

现在可以进行日期验证了,因此要过滤掉310298这样不存在的日期,我建议您事后手动进行-regex并不是进行这种逻辑验证的最佳工具。

编辑:

您可以使用DateTime.TryParse完成此操作。

DateTime resultDateTime;

var isValid = DateTime.TryParse(string.Format("{0}-{1}-{2}", 2010, 2, 31), out resultDateTime);

// isValid is false, because 31st of February 2010 does not exist.

var isValid = DateTime.TryParse(string.Format("{0}-{1}-{2}", 2010, 2, 27), out resultDateTime);

// isValid is true, and resultDateTime has been set to 27-2-2010.

请注意,DateTime.TryParse对文化敏感。根据目标区域性,您可能需要更改输入字符串。参见MSDN reference for TryParse

EDIT2:

因此,将其与您现有的代码连接起来

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.
}

Validate所在的位置:

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属性为我们提供捕获组。 Groups[0]将是整个匹配的字符串,然后每个下一个将是与正则表达式中用括号括起来的组之一匹配的子字符串-因此第一个是(0[1-9]|[1-2]\d|3[0-1]),代表天,第二个是几个月,依此类推。然后,我们只检查日期是否有效(再次,对文化敏感!)。另外,我们可以为_参数巧妙地使用C#7丢弃语法(out),因为我们不需要它。

答案 1 :(得分:0)

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

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

    }