2009-11-17 3 views
0

У меня есть куча файлов, которые нужно разобрать, и все они имеют один из двух шаблонов даты в имени файла (мы обновляем нашу систему, и нам нужно, чтобы файл-анализатор был способный распознавать как форматы даты, так и новые).C# Lazy Regular Expression Matching

Имена файлов выглядят либо <fileroot>_yyyyMMdd.log или <fileroot>_MMddyy.log, и мне нужно, чтобы быть в состоянии разобрать цифры, чтобы разобрать даты, однако, всякий раз, когда я пытаюсь использовать регулярное выражение как ^.*(\\d{6,8}).*$ или ^.*(\\d{6}|\\d{8}).*$, чтобы разобрать число из date, группа захвата всегда имеет длину 6 символов, даже для имен файлов, которые составляют 8 цифр.

Есть ли способ заставить библиотеку регулярных выражений на C# быть настолько исчерпывающей, насколько это возможно при попытке сопоставить регулярное выражение? Я знаю, как это сделать на Java, просто не C#/.NET, я довольно новичок на этом языке.

ответ

3

Проблема здесь: «. *». Regex жадный, поэтому он соответствует как можно большему количеству символов. В том числе двух первых цифр

Solutions:

1) .*_(\\d{6,8}) - если у вас всегда есть _ перед цифрами

2) .*[^\\d](\\d{6,8})

3) .*?(\\d{6,8})

Вы бы иметь такую ​​же проблему в Java, Regex жадно повсюду.

+0

# 1 сделал трюк, большое спасибо за вашу помощь. –

1

Если вы знаете, что дата всегда сопровождается известной строки, я бы изменить регулярное выражение, чтобы заставить соответствующие эту строку:

^.*(\\d{6,8})\.log$ 

Это заставит движок регулярных выражений, чтобы потреблять все 8 цифр в порядке чтобы соответствовать завершающему \.log.

+0

Пробовал, не работает. Локальное совпадение (явно дефолтное) механизма регулярного выражения .NET получает «091117» при сравнении с fileroot_20091117.log с использованием этого регулярного выражения. –