【问题标题】:Regex to validate at most 2 numbers and at most 4 alphabets in an string of length 6正则表达式验证长度为 6 的字符串中最多 2 个数字和最多 4 个字母
【发布时间】:2009-08-24 18:49:12
【问题描述】:
  1. 字符串的最大长度为 6。
  2. 字符串最多包含 2 位数字
  3. 字符串最多包含 4 个字母

所以下面的例子应该匹配

abcd22

a1cd3d

11acde

a1c

1ad

【问题讨论】:

  • 没有数字和字母的字符串呢?
  • 字符串可以包含小于 2 和 4 的限制吗? “1a2”有效吗?
  • 是的,但字符串没有数字和字母无效

标签: .net regex


【解决方案1】:

你想要的在正则表达式中实际上是不可能的,因为正则表达式不能计数,这在此处是必需的。事实上,正则表达式 似乎 能够按直接顺序计算字符,例如在这种情况下:

/x{2,3}/ # 2 or 3 ‘x’s

……但这其实不算,因为它只是这个表达式的一个快捷方式:

/xxx?/

即2 个x,后跟可选的第三个。

另一方面,您的表达式必须在表示该表达式的整个自动机上跟踪两个不同的计数器。这在经典正则表达式中根本不可能(而且使用更现代的正则表达式化身仍然非常困难,这些正则表达式使用下推自动机来保存状态)。

【讨论】:

    【解决方案2】:

    我会对一堆正则表达式进行 OR 测试:

    /^[a-z0-9]{0,6}$/ # at most 6 characters
    /([a-z].*){5}/    # more than 4 letters
    /(\d.*){3}/       # more than 2 digits
    

    所以:

    if ( /^[a-z0-9]{0,6}$/ and !( /([a-z].*){5}/ or /(\d.*){3}/ ) ) {
      print "valid";
    }
    

    【讨论】:

    • 我在问题中看不到任何暗示其他字符不应该验证的内容
    • 最多应为 4 个字母和最多 2 个数字,即字母
    • 好的,这很容易解决 - 更新了我的答案 - 而不是看 .{0,6} 我现在看 [a-z0-9]{0,6} @kurozakura - 你可能要考虑在总数 6 中只允许字母和数字的问题中添加。
    【解决方案3】:

    我不会为此使用正则表达式,除非可能检查字母数字/小于 6:/^[0-9a-z]{1,6}$/i。但是计数条件虽然在技术上使用正则表达式是可行的,但通过简单计数做得更好。

    所以我会

    1. 测试是否匹配正则表达式/^[0-9a-z]{1,6}$/i
    2. 然后使用 for 循环计算字符类出现次数

    【讨论】:

      【解决方案4】:

      正则表达式不擅长跟踪状态。您可以使用正则表达式来做到这一点,但使用简单的计算器和小型正则表达式程序会更容易:

      bool IsValid(string s)
      {
         int numInts = 0;
         int numChars = 0;
         Regex isDigit = new Regex(@"\d");
         Regex isChar  = new Regex(@"[a-zA-Z]"); // NOTE: will NOT catch non english letters
      
         if (s.Length() <= 6) 
         {
             return false;
         }
      
         foreach (char c in s)
         {
             if (isDigit.IsMatch(c)) 
             {
                 ++numInts;
             }
             if (isChar.IsMatch(c))
             {
                 ++numChars;
             }
         }
      
         return numInts == 2 && numChars == 4;
      

      }

      构造/重命名 args 以满足您的需求。

      当然,如果您想非常喜欢 C,您可以对 char 进行数字比较,但这会进一步使您远离可靠、稳健的解决方案。

      【讨论】:

        【解决方案5】:

        您可以使用负前瞻来做到这一点。

        (?!\d{5})(?![a-z]{3})[a-z0-9]{1,6}
        

        如果找到 5 个或更多数字,(?!\d{5}) 将失败

        如果找到 3 个或更多字符,(?![a-z]{3}) 将失败

        如果这两个都通过,我们最终会验证有 1 到 6 个字母数字字符与 (?!\d{5})(?![a-z]{3})[a-z0-9]{1,6}

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-15
          • 2022-06-13
          • 2019-10-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多