2017-05-02 19 views
3

Ich versuche, eine Übereinstimmung zwischen einer Zeichenfolge und einem Muster mithilfe von Regex.IsMatch() zu finden. Ich umrahmte die Regex und testete sie mit regex101.com funktioniert es gut. Jetzt Problem ist, dass Regex.IsMatch(filename, curSetting.RegExMatch.ToString()); Wahr zurückgibt curSetting.RegExMatch.IsMatch(filename)) gibt false für den gleichen Dateinamen zurück. Kann jemand erklären, wie sich das unterscheidet und was ist der Unterschied zwischen ihnen?Regex.IsMatch gibt zwei verschiedene Ausgabe in C zurück #

RegExMatch ist mein Regex Mitglied von curSetting Objekt. Testdaten in meinem Fall ist Muster ist

Gen(?!.*(?:erallog))(?<SerialNo>.+?)-(?<Year>(?:\d{2}))(?<Month>\d{2})(?<Day>\d{‌2})(?<Other>.*?\.log‌) 

Die Zeichenfolge ist 1_GeneralLog1370013-170403.log.

+0

Bitte teilen Sie den vollständigen entsprechenden Code. Was ist das 'curSetting.RegExMatch' Muster? Was ist der Dateiname? –

+0

Es wäre hilfreich, wenn Sie das Muster und den Text, in dem Sie suchen, posten. Und vielleicht hilft Ihnen das [Regulärer Ausdruck in Regextester, aber nicht in C#] (http://stackoverflow.com/questions/24687028)/regular-expression-working-in-regex-tester-aber-nicht-in-cis) –

+0

Welcher Typ ist 'RegExMatch'? Habe nie davon gehört. –

Antwort

2

Es ist klar, dass Ihre curSetting.RegExMatch mit einem RegexOptions.IgnoreCase Flag kompiliert wird: die (?!.*(?:erallog)) Fall-unsensibel behandelt wird und paßt die eralLog in Ihrem 1_GeneralLog1370013-170403.log Eingabestring, so das negative findet Look-Ahead-Muster ein Spiel und nicht das Gesamtspiel.

So gibt es zwei Wege aus (je nachdem, was Sie brauchen):

  • Entweder die RegexOptions.IgnoreCase aus der Initialisierung Regex Objekt entfernen oder
  • Fügen Sie die Groß- und Kleinschreibung Inline-Option (?i) in das Muster :

    (?i)Gen(?!.*(?:erallog))(?<SerialNo>.+?)-(?<Year>(?:\d{2}))(?<Mo‌nth>\d{2})(?<Day>\d{2})(?<Other>.*?\.log)

Verwandte Themen