我有一个导入客户数据的C#应用程序,我发现一个用例具有挑战性。首先,下面是一些字符串示例:
Z20Q
M20A1070A20T
M20A1070D03D0480A20B
我需要一个c#正则表达式来提取以下任意一种模式,只要发现它们的频率即可,其中L
=字母,N
=数字:
LNNL
或LNNLNNNN
您可以指望以下内容:
LNNLNNNN
之前,必须先尝试匹配LNNL
。如果LNNLNNNN
被匹配,请提取它并继续尝试匹配字符串的其余部分。所以让我们逐步介绍一下:
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]?$
-这似乎是一个有希望的开端,但是我的正则表达式功夫薄弱,我将不胜感激一些建议。
答案 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
正则表达式基本上说匹配主模式,然后还可选地匹配四位数字。由于正则表达式是贪婪的,因此如果存在四个多余的数字,它将始终取四。
值得注意的是,这目前仅采用大写字母(如您的示例所示)。如果您需要不区分大小写的搜索,则需要对其进行一些修改。