正则表达式从ED开始提取7位数字或字符串

时间:2017-04-11 13:01:47

标签: c# regex

鉴于以下内容

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;

    }

1 个答案:

答案 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;
}