【问题标题】:New Mercosul License Plates Regex新的 Mercosul 车牌正则表达式
【发布时间】:2015-04-23 21:16:40
【问题描述】:

新的 Mercosul 车牌有以下规则:

  • 必须有 7 个字母数字,其中:
    • 4 是字母 (A-Z)
    • 3 是数字 (\d)
  • 字母和数字无论如何都可以洗牌。

所以以下文本有效:AB123CD、1A2B3CD、123ABCD、ABCD123

这些是无效的:ABC1234D、ABCDE12、ABC123 等

我知道我可以通过只检查字符串大小和计数数字和字母的代码来实现这一点,但是这个问题让我想知道这是否也可以通过正则表达式来实现。

我能想到的就是生成所有可能性,例如 (\d{3}[A-Z]{4}) , (\d{2}[A-Z]{4}\d) 并使用 |加入他们,考虑到大量的组合,这根本不实用,还有其他想法吗?或者这只是 Regex 不可行的一种情况?

回答后编辑:

正如@stribizhev 所发布的,这是一个典型的前瞻用例。

我发现这个link 是一个非常有用的来源

here's an example 了解如何使用环视方法执行密码验证

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    您可以使用以下正则表达式实现该验证:

    ^(?=(?:.*[0-9]){3})(?=(?:.*[A-Z]){4})[A-Z0-9]{7}$
    

    说明

    • (?=(?:.*[0-9]){3}) - 正向前瞻检查 3 位数字
    • (?=(?:.*[A-Z]){4}) - 正向前瞻检查 4 个字母
    • [A-Z0-9]{7}- 由 7 个字母数字符号组成的实际字符串(不包括属于 \w 模式的 _

    由于锚点(^$),应传递单个字符串以通过此测试。

    您可以通过添加适当的选项来添加不区分大小写的匹配。

    在 Expresso 中测试:

    【讨论】:

    • 我添加了解释。如果您知道什么是前瞻,那么很快就会了解如何构建此类正则表达式。我真的很喜欢正则表达式的紧凑特性:其他答案需要几行,我的实际上是 1。
    【解决方案2】:

    对于这种事情,从另一个方向看会更容易(在伪代码中):

    letters = regex(s/[^a-z]//, license_plate);
    numbers = regex(s/[^\d]//, license_plate);
    
    if (length(letters) == 4) && (length(numbers) == 3)) {
       plate is ok
    }
    

    【讨论】:

      【解决方案3】:

      我喜欢不走的风格。

      bool CheckPlate(string str)
      {
          int let = 0;
          int dig = 0;
          foreach (ch letter in input)
          {
              let += (int) IsLetter(ch);
              dig += (int) IsDigit(ch);   
          }
          if(let == 4 && dig == 3 && str.Lenght() == 7)
              return true;
          else
            return false;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-16
        • 1970-01-01
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多