鉴于以下内容
1234567 Should return 123456
ED12345 Should return ED12345
1234567_1 Should return 1234567
1234567(1) Should return 1234567
1234567 (1) Should return 1234567
A1234567B Should return 1234567
A12345678Z Should return nothing
12345678 (1) should return nothing
12345678(1) should return nothing
我一直试图找到一个可以做到这一点的正则表达式。我有以下C#来解决它使用一些正则表达式,但我不确定它是否适用于所有实例。
private static String ExtractFIN ( String s )
{
String result = String.Empty;
MatchCollection c = default(MatchCollection);
c = Regex.Matches(s, @"\d{7}");
if (s.All(char.IsDigit) || c.Count == 1)
{
// c = Regex.Matches(s, @"\d{7}");
if (c.Count == 1) result = c[0].Value.ToString();
}
else if (s.Substring(0,2) == "ED")
{
result = s;
}
else
{
c = Regex.Matches(s, @"(^|\D)\d{7}($|\D)");
if (c.Count == 1)
{
result = c[0].Value.ToString().Substring(1, 7);
}
}
return result;
}
答案 0 :(得分:1)
这是一种至少适用于您提供的示例的方法。 (我假设第一个例子,它只返回7个数字中的6个不是一个错字。)还有其他内置的假设,因为你的问题并没有真正解释格式化FIN的规则是什么。
private static String ExtractFIN (String s)
{
Match m = Regex.Match(s,@"(^(?<fin>\d{6})\d$)|((^|^.*\D)(?<fin>\d{7})(\D.*$|$))|(^(?<fin>ED\d+)$)");
return m.Success ? m.Groups["fin"].Value : String.Empty;
}