我有一个导入客户数据的C#应用程序,我发现一个用例很具有挑战性。首先,以下是字符串的一些示例:
Z20Q
M20A1070A20T
M20A1070D03D0480A20B
我需要一个C#REGEX来提取以下两个模式,在发现L
=字母和N
=数字:
LNNL
或LNNLNNNN
您可以指望以下内容:
- 模式不能重叠。找到匹配项后,提取该细分市场,只查看尚未匹配的剩余字符串。
- 字符串的每个字符都会匹配 - 都不会丢弃字符。
- 必须在尝试匹配
LNNL
之前尝试匹配LNNLNNNN
。如果LNNLNNNN
匹配,请提取并继续尝试匹配字符串的剩余内容。 - 这些模式的长度和位置是精确的,可以依靠。但是从我的示例字符串中可以看到,字符串的长度可能会有所不同。
- 每个提取/匹配的字符串必须正好是4个字符或完全8个字符。
- 每个字符串的字符数将是4:4、8、12、16、20的精确倍数(我认为不能超过20)
- 字符串将完全由字母数字字符组成 - 没有空格或特殊字符 - 只是字母和数字
所以让我们走几步:
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
正则是基本上说匹配主模式,然后选择匹配四位数。因为以至于贪婪是贪婪的,如果存在,它将始终需要四个额外的数字。
注意到,目前仅在大写字母(如您的示例中)。如果您需要案例不敏感的搜索,则需要稍微修改它。