C# 新南方共同市场牌照Regex

C# 新南方共同市场牌照Regex,c#,.net,regex,C#,.net,Regex,新的南方共同市场牌照有以下规则: 必须有7个字母数字,其中: 4是字母(A-Z) 3是数字(\d) 无论如何,字母和数字都可以混洗 因此以下文本有效:AB123CD、1A2B3CD、123ABCD、ABCD123 这些是无效的:ABC1234D、ABCDE12、ABC123等 我知道我可以通过代码来实现这一点,只需检查字符串大小并计算数字和字母,但这个问题让我想知道是否也可以通过正则表达式来实现 我所能想到的就是生成所有的可能性,比如(\d{3}[A-Z]{4}),(\d{2}[A-Z]

新的南方共同市场牌照有以下规则:

  • 必须有7个字母数字,其中:
    • 4是字母(A-Z)
    • 3是数字(\d)
  • 无论如何,字母和数字都可以混洗
因此以下文本有效:AB123CD、1A2B3CD、123ABCD、ABCD123

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

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

我所能想到的就是生成所有的可能性,比如(\d{3}[A-Z]{4}),(\d{2}[A-Z]{4}\d)并使用|来连接它们,考虑到大量的组合,这是不实际的,还有其他想法吗?或者这只是一个例子,正则表达式是不允许的

回答后编辑:

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

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


关于如何使用lookarounds执行密码验证,您可以使用以下正则表达式实现该验证:

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

  • (?=(?:.[0-9]){3}
    -向前看以检查是否有3位数字
  • (?=(?:.[A-Z]){4}
    -向前看,检查4个字母
  • [A-Z0-9]{7}
    -由7个字母数字符号组成的实际字符串(不包括属于
    \w
    模式的
    \u
由于锚(
^
$
)的原因,应通过单个字符串以通过此测试

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

在Expresso中测试:


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

我喜欢不走的风格

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

我补充了解释。如果您知道什么是前瞻性的,那么很快就会理解如何构建这样的正则表达式。我非常喜欢正则表达式紧凑的特性:其他答案需要几行,我的答案实际上是1。
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;
}