C# 如何在已知长度内匹配字母和数字的精确组合?

C# 如何在已知长度内匹配字母和数字的精确组合?,c#,regex,C#,Regex,我有一个导入客户数据的C#应用程序,我发现有一个用例很有挑战性。首先,以下是一些字符串示例: Z20Q M20A1070A20T M20A1070D03D0480A20B 我需要一个c#regex来提取以下模式中的任意一种,只要找到它们,其中L=字母和N=数字: LNNL或LNNLNNNN 您可以信赖以下几点: 模式不能重叠。找到匹配项后,提取该段,只查看尚未匹配的任何剩余字符串 字符串的每个字符都将匹配-不会丢弃任何字符 必须先尝试匹配LNNLNNNN,然后再尝试匹配LNNL。如果匹配了lnn

我有一个导入客户数据的C#应用程序,我发现有一个用例很有挑战性。首先,以下是一些字符串示例:

Z20Q

M20A1070A20T

M20A1070D03D0480A20B

我需要一个c#regex来提取以下模式中的任意一种,只要找到它们,其中
L
=字母和
N
=数字:

LNNL
LNNLNNNN

您可以信赖以下几点:

  • 模式不能重叠。找到匹配项后,提取该段,只查看尚未匹配的任何剩余字符串
  • 字符串的每个字符都将匹配-不会丢弃任何字符
  • 必须先尝试匹配
    LNNLNNNN
    ,然后再尝试匹配
    LNNL
    。如果匹配了
    lnnnnn
    ,则提取它并继续尝试匹配字符串的剩余部分
  • 这些图案的长度和位置是精确的,并且可以计算。但正如您从我的示例字符串中看到的,字符串的长度可能会有所不同
  • 每个提取/匹配的字符串必须正好是4个字符或正好是8个字符
  • 每个字符串的字符数将是4:4、8、12、16、20的精确倍数(我认为不会超过20个)
  • 字符串将完全由字母数字字符组成-没有空格或特殊字符-只有字母和数字
  • 因此,让我们逐步了解以下几点:

    Z20Q
    -我们完成了-如果是4个字符,我不需要正则表达式,我可以 抓住它走吧

    M20A1070A20T
    应生成并提取两个字符串:
    M20A1070
    (匹配项 模式
    LNNLNNNN
    )和
    A20T
    (匹配模式
    LNNL

    M20A1070D03D0480A20B应生成并提取3个字符串:
    M20A1070
    (匹配模式
    LNNLNNNN
    )和
    D03D0480
    (匹配模式
    LNNLNNNN
    )和
    A20B
    (匹配模式
    LNNL


    我一直在学习,看
    ^[G][0-9]{1,5}$${[G][0-9]{4}[A-Z].$
    -这似乎是一个很有希望的开始,但我的正则表达式功夫很弱,我非常感谢你的建议。

    以下内容应该可以满足你的要求:

    var input = "M20A1070D03D0480A20B";
    var regex = new Regex("[A-Z][0-9]{2}[A-Z]([0-9]{4})?");
    
    foreach(var match in regex.Matches(input).Cast<Match>().Select(x=>x.Value))
    {
        Console.WriteLine(match);
    }
    
    var input=“M20A1070D03D0480A20B”;
    var regex=newregex(“[A-Z][0-9]{2}[A-Z]([0-9]{4}”);
    foreach(regex.Matches(input.Cast().Select(x=>x.Value))中的变量匹配)
    {
    控制台写入线(匹配);
    }
    
    输出:

    M20A1070
    D03D0480
    A20B

    正则表达式基本上说匹配主模式,然后可选地匹配四位数字。因为正则表达式是贪婪的,所以如果存在四个额外的数字,它总是会占用它们


    值得注意的是,这目前仅假设为大写字母(如您的示例中所示)。如果您需要不区分大小写的搜索,您需要稍微修改它。

    @ErikPhilips:Ah。我只是在上面评论了一下(现在删除了),想知道我是否错过了什么。我猜是你错过了什么工作完美。谢谢你,克里斯!