C # Lazy Regular Expression Matching - PullRequest
       6

C # Lazy Regular Expression Matching

0 голосов
/ 18 ноября 2009

У меня есть куча файлов, которые нужно проанализировать, и у всех них есть один из двух шаблонов даты в имени файла (мы обновляем нашу систему, и нам нужно, чтобы анализатор файлов мог распознавать обе даты форматы, новые и старые).

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

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

Ответы [ 2 ]

3 голосов
/ 18 ноября 2009

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

Решения:

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

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

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

У вас будет такая же проблема в Java, Regex везде жадный.

1 голос
/ 18 ноября 2009

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

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

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

...