2015-01-29 1 views

ответ

0

Не назначайте указанную группу захвата как необязательную.

@"(?<=\/)(?<Year>\d{4})(?=\/)" 

ИЛИ

@"\b(?<Year>\d{4})\b" 

DEMO

(?<Year>\d{4})? соответствует опциональной 4-значный номер. ? после того, как названная группа захвата делает всю группу необязательной. А также добавить границы слов, так что он не будет 4-значное число от 20150111

string input = "abc/2015/01/11/efg_20150111.tsv"; 
Regex rgx = new Regex(@"\b(?<Year>\d{4})\b"); 
foreach (Match m in rgx.Matches(input)) 
Console.WriteLine(m.Groups[1].Value); 

IDEONE

3

Это потому, что регулярное выражение не является обязательным. (?<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 ''. 

Это путь регулярных выражений двигатели работают

+0

* так много матчей *. – Rawling

Смежные вопросы