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

时间:2019-03-05 17:55:35

标签: c# regex

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

Z20Q

M20A1070A20T

M20A1070D03D0480A20B

我需要一个c#正则表达式来提取以下任意一种模式,只要发现它们的频率即可,其中L =字母,N =数字:

LNNLLNNLNNNN

您可以指望以下内容:

  1. 模式不能重叠。找到匹配项后,提取该段,然后仅查看尚未匹配的任何剩余字符串。
  2. 字符串中的每个字符都将匹配-不会丢弃任何字符。
  3. 在尝试匹配LNNLNNNN之前,必须先尝试匹配LNNL。如果LNNLNNNN被匹配,请提取它并继续尝试匹配字符串的其余部分。
  4. 这些图案的长度和位置是精确的,可以依靠。但是从我的示例字符串中可以看到,字符串的长度可以变化。
  5. 每个提取/匹配的字符串必须完全是4个字符或完全是8个字符。
  6. 每个字符串的字符数将是4的精确倍数:4、8、12、16、20(我认为不会超过20)
  7. 字符串将完全由字母数字字符组成-不能包含空格或特殊字符-只能是字母和数字

所以让我们逐步介绍一下:

  

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

     

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

     

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

我一直在研究this stack post,看着^[G][0-9]{1,5}?$|^[G][0-9]{4}[A-Z]?$-这似乎是一个有希望的开端,但是我的正则表达式功夫薄弱,我将不胜感激一些建议。

1 个答案:

答案 0 :(得分:5)

以下应做您想做的事:

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

输出:

  

M20A1070
  D03D0480
  A20B

正则表达式基本上说匹配主模式,然后还可选地匹配四位数字。由于正则表达式是贪婪的,因此如果存在四个多余的数字,它将始终取四。

值得注意的是,这目前仅采用大写字母(如您的示例所示)。如果您需要不区分大小写的搜索,则需要对其进行一些修改。