2009-11-17 15 views
0

J'ai un tas de fichiers qui doivent être analysés, et ils ont tous deux l'un des deux modèles de date dans le nom de fichier (nous mettons à jour notre système, et nous devons avoir l'analyseur de fichiers capable de reconnaître les deux formats de date, nouveaux et anciens).C# Correspondance d'expressions régulières paresseuses

Les noms de fichiers ressemblent soit <fileroot>_yyyyMMdd.log ou <fileroot>_MMddyy.log, et je dois être en mesure d'analyser les chiffres pour analyser les dates, mais, chaque fois que j'essaie d'utiliser une expression régulière comme ^.*(\\d{6,8}).*$ ou ^.*(\\d{6}|\\d{8}).*$ pour analyser les chiffres du date, le groupe de capture est toujours de 6 caractères, même pour les noms de fichiers à 8 chiffres.

Existe-t-il un moyen de forcer la bibliothèque d'expressions régulières en C# à être aussi exhaustive que possible pour essayer de faire correspondre une expression régulière? Je sais comment le faire en Java, juste pas C#/.NET, je suis assez nouveau à la langue.

Répondre

3

Le problème est ici: ". *". Regex est gourmand, donc il correspond autant de symboles que possible. Y compris les deux premiers chiffres

Solutions:

1) .*_(\\d{6,8}) - si vous avez toujours _ avant que les chiffres

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

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

Vous auriez le même problème en Java, Regex est gourmand partout.

+0

# 1 a fait l'affaire, merci beaucoup pour votre aide. –

1

Si vous savez que la date est toujours suivie d'une chaîne connue, je change le regex pour forcer correspondant à cette chaîne:

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

Cela forcera le moteur de regex à consommer tous les 8 chiffres dans l'ordre pour correspondre à la fin \.log.

+0

Essayé, ne fonctionne pas. La mise en correspondance paresseuse (apparemment par défaut) du moteur .ge regex obtient '091117' en comparaison avec fileroot_20091117.log en utilisant cette expression régulière. –