2009-08-04 19 views
0

Ich versuche, ein Fragment eines Stacktrace zu analysieren, die wie folgt ziemlich genau aussieht:einen Teilstring mit einem regulären Ausdruck Passende

at Test.Test1() in C:\Projects\Project\Test.cs:line 37 

eine regex wie dies wie beabsichtigt funktioniert:

at (.*?) in (.*?):line (\d*) 

Das passt

  1. Test.Test1()
  2. C: \ Projects \ Project \ Test.cs

Diese Regex ist mit einem Englisch stacktrace fest einprogrammiert, so gibt es offensichtlich keine Spiele, wenn der Stacktrace in einer anderen Sprache ist, wie schwedisch:

vid Test.Test1() i C:\Projects\Project\Test.cs:rad 37 

zu machen die Anpassung mehr sprachneutral ich habe versucht, diese regex aus:

(.*?) .*? (.*?) (\d*) 

das passt

  1. Test.Test1()
  2. C: \ Projects \ Project \ Test.cs: line

Die Frage ist, wie würde ich den Dateipfad ohne den hinteren übereinstimmen: Linie?

Antwort

2

Sie könnten versuchen, Hartcodierung die Notwendigkeit

.:[^:]* 

Nach dem Doppelpunkt nach dem Laufwerksbuchstabe offensichtlich nicht weiter Kolon sein kann dort der Teil des Dateinamen sein würde: im Dateinamen Teil einen Doppelpunkt an der zweiten Stelle mit.Sie könnten mit UNC-Pfade zu bewältigen haben, obwohl, so folgendes dass beheben könnte:

.:?[^:]* 

die für UNC-Pfade den Doppelpunkt optional zu ermöglichen, macht.

Also, Ihre Aufnahmen für den Dateinamen Teil mit der „: Linie“ nach könnte wie folgt aussehen:

(.:?[^:]*):\S+ 
+0

Genau das, was ich gesucht habe, Prost! –

+0

Wenn Sie wissen, dass der letzte Doppelpunkt in der gesamten Zeile den Pfad vom Zeilenwort (oder was auch immer) trennt, können Sie versuchen, eine gierige Form der Suche zu verwenden: so (. *): (\ S +) passt dazu. Dies wird dann relative Pfade ohne Doppelpunkt oder sogar alte Apple Mac Pfade mit Doppelpunkt als Pfadtrennzeichen behandeln – Xetius

1

(. ?).? (. ?): (\ S +) (\ d)

Ich nehme an, dass die Leerzeichen zwischen den Übereinstimmungen tatsächlich die Leerzeichen in der Regex übereinstimmen. Der Doppelpunkt wird in allen Sprachen wahrscheinlich konstant sein, so brauchen Sie nur

Bearbeiten nach dem Doppelpunkt Nicht-Leerzeichen übereinstimmen:

ein Spiel hatte sich um und kam mit dieser:

.+?\s+(\S+)\s+.+?\s+(.*):(\S*)\s(\d+) 

für

at Test.Test1() in C:\Projects\Project Folder\Test.cs:rad 37 

Der Doppelpunkt im Weg warf mich für eine Sekunde. aber dies sollte

Test.Test1() in $ 1 C: \ Projects \ Projects Folder \ Test.cs in $ 2 rad in $ 3 37 in $ 4

+0

Ja Ihre Annahme ist richtig. Abgesehen von der Lesbarkeit gibt es noch andere Unterschiede zwischen unseren Regexen? Ich nehme an, deine Version ist effizienter? –

Verwandte Themen