【问题标题】:RegEx to check validate if string has 0 or more numerical values & other items正则表达式检查字符串是否有 0 个或多个数值和其他项目
【发布时间】:2015-04-20 15:47:00
【问题描述】:

我是正则表达式的初学者,所以我被困在一些可能相当简单的东西上——或者可能不是,我只是不知道。也很抱歉,我将逐步介绍我的思考过程,不确定它是否真的有帮助。

无论如何,我想验证用户输入的值是否符合我列出的某些标准。它们是:
最大长度为 10
最小长度为 4
至少 4 个字母
可变的最小数字(当前为 0)

所以理论上 aa1aa2 的值会通过。

最初我从以下开始,它验证了 4 个小写或 4 个大写。

[a-z]{4}|[A-Z]{4}$

但是这不允许任何一个/或,这导致我更新它

([a-z]|[A-Z]){4}$

为了验证它是否包含必要的最小数字,我将其更改为:

(([a-z]|[A-Z]){4})([0-9]{0})$

我可以通过在某些情况下进行有效/失败的不同尝试来让人们厌烦,但基本上我开始注意到它只验证了有 4 个字母和一个数字的实例,我最终(在同事的帮助下)来了解决这个问题:

^(?!^[0-9]*$)(?!^[a-zA-Z]{4}$)^([a-zA-Z0-9]{4,10}$)

这几乎可以如我所愿。它将验证字符串的长度,以及是否有大写/小写,但只有当我包含一个数字时才会起作用。我在下半场(在 {4,10} 之前)尝试去除 0-0 并添加 {0} 的任何尝试都没有成功。基本上没有数字是行不通的!

如何修改最终的 sn-p 以便我可以设置一个可能有 0 个数字的子句?

【问题讨论】:

  • 不是一个答案,而是一个建议:即使您创建了一个可以验证这四个条件的正则表达式,我不确定您是否可以,任何阅读您的代码的人都完全不可能理解它的意图。我建议将验证拆分为多个步骤,并使用单独的、更简单的表达式来验证每个步骤。
  • regexr.com 是一个非常酷的学习正则表达式和测试它的网站

标签: c# regex


【解决方案1】:

在 C# 正则表达式引擎(如 PCRE 中)中,您可以使用 \p{L} 匹配任何小写/大写 Unicode 字母。限制是在前瞻的帮助下设置的。锚点(^$)用于检查整个字符串/行。

这是一个检查您的条件的正则表达式。现在,它只需要输入 1 位数字:

^(?=.*\p{L}.*\p{L}.*\p{L}.*\p{L}.*$)(?=.*\d.*$).{4,10}$

解释:

  • ^ - 字符串/行开始
  • (?=.*\p{L}.*\p{L}.*\p{L}.*\p{L}.*$) - 正面预测要求至少 4 个可能不连续的 Unicode 字母。
  • (?=.*\d.*$) - 正面预测至少需要 1 位数字
  • .{4,10} - 任何字符,出现 4 到 10 次
  • $ - 字符串/行结束

regexstorm.net 上查看demo

【讨论】:

    【解决方案2】:

    正如 Dan 所建议的,我也非常喜欢更易读的方法:

     static void Main(string[] args)
     {
         var input = "testtest";
         var numDigits = 2;
    
         bool valid = input.Length > 3
                      && input.Length < 11
                      && input.Where(char.IsLetter).Count() > 3
                      && input.Where(char.IsDigit).Count() > numDigits;
     }
    

    使用这种方法,您可以对验证进行分段,并向用户提供更有用的响应:input must be at least 4 letters

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      相关资源
      最近更新 更多