2016-08-14 4 views
1

Warum analysiert dieses Regexmuster die Zeichenfolge "Season 02 Episode 01" nicht richtig?Regex Problemanalyse Saison/Episodenmuster

Zum Beispiel ist dies kein Spiel:

var fileName = "Its Always Sunny in Philadelphia Season 02 Episode 01 - Charlie Gets Crippled.avi" 

// Regex explanation: 
// Starts with "S" and can contain more letters, can continue with space, then contains two numbers. 
// Then starts with "E" again and can contain more letters, can continue with space, then contains two numbers. 
var pattern = @"S\w?\s?(\d\d)\s?E\w?\s?(\d\d)"; 
var regex = new Regex(pattern, RegexOptions.IgnoreCase); 
var match = regex.Match(fileName); 

Antwort

1

Verwenden * statt ?

? ist für 0 oder 1 Mal. * ist für 0 oder mehrere Male.

+0

Sie haben absolut Recht, das war mein Fehler. Dies ist das festgelegte Muster: 'var pattern = @" S \ w * \ s * (\ d \ d) \ s * E \ w * \ s * (\ d \ d) ";'. –

1

Beginnt mit "S" und mehr Buchstaben enthalten [...]

Sie meinen +, nicht ?.

var pattern = @"S\w+\s+(\d+)\s+E\w+\s+(\d+)"; 

Beachten Sie, dass diese Regex ziemlich unspezifisch ist. Achten Sie auf falsche Positive. Ich würde empfehlen, den Ausdruck spezifischer zu machen.

+0

+1 für '(\ d +)', was eine Verbesserung meiner Regex ist. Aber in den anderen Fällen funktioniert '+' nicht ('*' tut, wie von M.kazem Akhgary vorgeschlagen), weil ich 0 oder mehr Instanzen erwarte. Was im ursprünglichen Beitrag nicht erwähnt wurde (und ich bedauere es, ich nahm es als selbstverständlich hin und ich hätte es nicht tun sollen) ist, dass "S02E01" auch ein Treffer ist. Über "Achten Sie auf falsche Positive" haben Sie auch Recht, aber die Eingabeformate variieren stark, so dass das Muster absichtlich generisch ist. –

+0

Ja, du hast Recht, um 'S01' zu fangen, du müsstest den Stern benutzen. Ziemlich gewöhnliche Art, es zu schreiben, hätte darüber nachdenken sollen. – Tomalak