Это потому, что регулярное выражение не является обязательным. (?<Year>\d{4})?
говорит, «Матч 4 последовательных цифр, или ничего Ничто не остается матч, как показывает небольшой тест программы:.
Regex rx = new Regex(@"(?<Year>\d{4})?");
Match m = rx.Match("abc/2015/01/11/efg_20150111.tsv");
int i = 0 ;
while (m.Success)
{
Console.WriteLine("match #{0}: +{1}({2}) is '{3}'." ,
++i , m.Index , m.Length , m.Value) ;
m = m.NextMatch();
}
if (i == 0)
{
Console.WriteLine("No matches");
}
выше находит совпадение с нулевой длиной почти везде она выглядит, как его выход показывает:
match #1: +0(0) is ''.
match #2: +1(0) is ''.
match #3: +2(0) is ''.
match #4: +3(0) is ''.
match #5: +4(4) is '2015'.
match #6: +8(0) is ''.
match #7: +9(0) is ''.
match #8: +10(0) is ''.
match #9: +11(0) is ''.
match #10: +12(0) is ''.
match #11: +13(0) is ''.
match #12: +14(0) is ''.
match #13: +15(0) is ''.
match #14: +16(0) is ''.
match #15: +17(0) is ''.
match #16: +18(0) is ''.
match #17: +19(4) is '2015'.
match #18: +23(4) is '0111'.
match #19: +27(0) is ''.
match #20: +28(0) is ''.
match #21: +29(0) is ''.
match #22: +30(0) is ''.
match #23: +31(0) is ''.
Это путь регулярных выражений двигатели работают
использование 'функция regex.Matches' –