2016-06-09 14 views
0

Ich versuche, Parse eine Zeichenfolge durch Regex übereinstimmen. Das ist, was ich habe, so weit:Regex leiden und eine Zeichenfolge richtig analysieren

private string result = @"Range:\s*(?<start>.+\S)\s*to\s*(?<end>.+\S)[\S\s]+For more information, click the link below"; 

Und Code zu analysieren:

start = Convert.ToDateTime(matches.Groups["start"].Value) 
end = Convert.ToDateTime(matches.Groups["end"].Value) 

Hier ist ein Eingabebeispiel string:

Bereich: 8. Juni 2016 bis 9. Juni 2016
Für weitere Informationen, klicken Sie auf den Link unter

Das start Variable ist, wie unten zu erwarten:

6/8/2016 12:00:00 AM

Die end Variable auf Formatierung als DateTime einen Fehler werfen. Wenn ich Ausgang den Wert des end Regex, kommt es wie folgt aus:

9 Jun 2016 mehr infor .....

Was ich in meiner regex bin fehlt?

Antwort

0

Sie das gewünschte Ergebnis zu beschreiben haben würde, wenn der Text For more information, click the link below nicht erscheint eine separate Zeile.

Wenn das Zeilenvorschubzeichen nicht dem Datum folgt, werden .+ alle Zeichen bis zum nächsten Zeilenumbruch verwendet, der nur mit \s mit der Zeichenfolge übereinstimmt. Dies ist weil + ist gierig. Fügen Sie das Fragezeichen hinzu, um es faul zu machen. Weil es faul ist, brauchen Sie nicht wirklich die \S innerhalb der Capture-Gruppen:

Range:\s*(.+?)\s*to\s*(.+?)\s*For more information, click the link below 
1

Verwenden Sie dieses Muster:

@"Range:(?<start>\w+ \d+, \d+) to (?<end>\w+ \d+, \d+)" 

Nur für den Fall, müssen Sie den 2. Teil zum Spiel:

@"Range:(?<start>\w+ \d+, \d+) to (?<end>\w+ \d+, \d+)\r\nFor more information, click the link below"; 
0

Versuchen this Website. Die Regex, die es erzeugt, ist ein bisschen lang, aber es hat für mich funktioniert.