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

  • 本文关键字:数字 组合 c# regex
  • 更新时间 :
  • 英文 :


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

Z20Q

M20A1070A20T

M20A1070D03D0480A20B

我需要一个C#REGEX来提取以下两个模式,在发现L =字母和N =数字:

的情况下。

LNNLLNNLNNNN

您可以指望以下内容:

  1. 模式不能重叠。找到匹配项后,提取该细分市场,只查看尚未匹配的剩余字符串。
  2. 字符串的每个字符都会匹配 -
  3. 都不会丢弃字符。
  4. 必须在尝试匹配LNNL之前尝试匹配LNNLNNNN。如果LNNLNNNN匹配,请提取并继续尝试匹配字符串的剩余内容。
  5. 这些模式的长度和位置是精确的,可以依靠。但是从我的示例字符串中可以看到,字符串的长度可能会有所不同。
  6. 每个提取/匹配的字符串必须正好是4个字符或完全8个字符。
  7. 每个字符串的字符数将是4:4、8、12、16、20的精确倍数(我认为不能超过20)
  8. 字符串将完全由字母数字字符组成 - 没有空格或特殊字符 - 只是字母和数字

所以让我们走几步:

Z20Q-我们完成了 - 如果是4个字符,我不需要等级,我可以 抓住它然后去。

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

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

我一直在研究这个堆栈帖子,看着^[G][0-9]{1,5}?$|^[G][0-9]{4}[A-Z]?$-这似乎是一个有前途的开始,但是我的正则fu fu很弱,我非常感谢一些建议。

以下应执行您想要的事情:

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

正则是基本上说匹配主模式,然后选择匹配四位数。因为以至于贪婪是贪婪的,如果存在,它将始终需要四个额外的数字。

注意到,目前仅在大写字母(如您的示例中)。如果您需要案例不敏感的搜索,则需要稍微修改它。

最新更新