【问题标题】:How do I make regex properly validate the information?如何使正则表达式正确验证信息?
【发布时间】:2019-03-12 07:26:04
【问题描述】:

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

我们的个人代码是这样的: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 部分是一个问题。我知道这可能看起来完全错误,但我刚刚开始学习正则表达式,不知道什么是错的,什么是对的。

【问题讨论】:

  • 您能否显示有效(和无效)的输入?
  • i.imgur.com/BMFTgYq.png 有效部分的代码编写正确,因此未启用任何标签。无效部分的代码错误,因为我输入了 24 个月,这是错误的。当没有启用标签时会显示消息框,但应该有,因为个人代码编写不正确,但我的正则表达式没有看到它不正确,所以它没有启用''if''使标签能够发出错误信号。
  • 请将信息添加为文本,而不是屏幕截图。如果我正确理解 C#,Regex 类 (docs.microsoft.com/en-us/dotnet/api/…) 采用标准正则表达式语法。所以你需要^[0123]\d[01]\d\d\d-[A-Z]{5}$ 进行验证。
  • 我知道这是一个老话题,但他们停止在代码的第一部分使用日期。最后一位是校验和

标签: c# regex validation textbox


【解决方案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,我建议您事后手动进行 - 正则表达式不是此类逻辑验证的最佳工具。

编辑:

您可以使用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]) 代表天,第二个是月,所以在。然后我们只检查日期是否有效(同样,文化敏感!)。此外,我们可以巧妙地为 out 参数使用 C#7 丢弃语法 (_),因为我们不需要它。

【讨论】:

  • 这种逻辑验证的最佳工具是什么?编辑:由于某种原因,我的代码不理解该行中的 \d。
  • 我编辑了答案以包括使用DateTime.TryParse。是的,我忘记了正则表达式之前的@逐字修饰符,也对其进行了编辑。
  • 你能告诉我如何将它与我已经编写的代码联系起来吗?
  • 它说名称 '_' 在 DateTime.TryParse($"{day}-{month}-{year}", out _);的当前上下文中不存在;
  • 您确定在编译时启用了 C# 7.0 功能吗?
【解决方案2】:

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

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

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2021-10-06
    相关资源
    最近更新 更多