2017-10-30 1 views
0

Ich habe diesen Code, aber es Engpässe den gesamten Code. Irgendeine Idee, wie man das umwandelt, um effizienter zu sein?Regex läuft zu langsam

Regex.Replace(text, @".+[a-zA-Z0-9]{17,500}.+(\r\n)", Environment.NewLine, RegexOptions.Compiled); 
+1

Was versuchen Sie zu tun? Edit: Was ist deine Programmiersprache? – bfontaine

+0

Können Sie uns den ganzen Code zeigen? – STF

+0

Was ist 'Text'? Einige Dateiinhalte? Lesen Sie Zeile für Zeile (oder teilen Sie sie einfach mit einem Zeilenumbruch, wenn Sie eine mehrzeilige Zeichenfolge haben), und überprüfen Sie jede Zeile mit 'Regex.IsMatch (Zeile," [a-zA-Z0-9] {17.500} ")'. Bei einer Übereinstimmung, überspringen Sie die Zeile, sonst an die Ausgabe anhängen. Wenn Sie nach Effizienz fragen, ist nur ein Regex in der Post nicht genug. Bitte geben Sie weitere Einzelheiten an. –

Antwort

1

Das .+[a-zA-Z0-9]{17,500}.+(\r\n) Muster ist sehr ineffizient aufgrund der ersten .+ Unter-Pattern, das die ganzen Linie auf einmal packt und Backtracking dann für die Zeichenfolge zur Aufnahme von 17 (ja, 17 Zeichen werden überprüft und dann die Regex-Engine ruft ein Tag) alphanumerische Zeichen. Dies ist eine kostspielige Operation.

Sie sollten den Ansatz überdenken. Anstatt Regex.Replace zu verwenden, teilen Sie entweder den Text (wenn Sie eine große mehrzeilige Zeichenfolge haben) mit einem Zeilenumbruch, um ein Array von Zeilen zu erhalten, oder - wenn Sie von einer Datei lesen - lesen Sie Zeile für Zeile und überprüfen Sie jede Zeichenfolge (Element innerhalb einer Liste/Array oder die Linie) mit einem einfachen

Regex.IsMatch(line, "[a-zA-Z0-9]{17}") 

nur für 17 aufeinander folgende ASCII alphanumerische Zeichen zu überprüfen oder - um wirklich die Grenze von 17 bis 500 solcher Zeichen zu verhängen:

Regex.IsMatch(line, @"(?<![a-zA-Z0-9])[a-zA-Z0-9]{17,500}(?![a-zA-Z0-9])") 

Wenn Die Übereinstimmung wird gefunden, das Element/die Zeile wird übersprungen, andernfalls wird sie zur Ausgabe/dem resultierenden Array hinzugefügt, das Sie später verwenden werden string.Join("\n", resulting_list).

Die (?<![a-zA-Z0-9]) stellt sicher, dass das vorangestellte Zeichen kein alphanumerisches ASCII-Zeichen ist und (?![a-zA-Z0-9]) die gleiche Prüfung für das folgende Zeichen vornimmt.

+0

Ich kann eine Verbesserung der Leistung bestätigen. Es ist von relativ 50% auf 1% gesunken. – realPro