Ich erzeuge reguläre Ausdrücke dynamisch, indem ich durch eine XML-Struktur laufe und die Anweisung aufbaue, während ich durch ihre Knotentypen blicke. Ich verwende diesen regulären Ausdruck als Teil eines von mir definierten Layout-Typs. Ich analysiere dann eine Textdatei, die am Anfang jeder Zeile eine ID hat. Diese ID weist mich auf ein bestimmtes Layout hin. Ich versuche dann, die Daten in dieser Zeile mit seiner Regex zu vergleichen.Dynamisch aufgebaute reguläre Ausdrücke laufen extrem langsam!
Klingt gut und dandy richtig? Das einzige Problem ist, dass die Strings extrem langsam sind. Ich habe sie als kompiliert gesetzt, um die Dinge ein wenig zu beschleunigen, aber ohne Erfolg. Was verwirrend ist, ist, dass diese Ausdrücke nicht so komplex sind. Ich bin auf keinen Fall ein RegEx-Guru, aber ich kenne eine anständige Menge über sie, um die Dinge gut gehen zu lassen. Hier
ist der Code, der die Ausdrücke erzeugt ...
StringBuilder sb = new StringBuilder();
//get layout id and memberkey in there...
sb.Append(@"^([0-9]+)[ \t]{1,2}([0-9]+)");
foreach (ColumnDef c in columns)
{
sb.Append(@"[ \t]{1,2}");
switch (c.Variable.PrimType)
{
case PrimitiveType.BIT:
sb.Append("(0|1)");
break;
case PrimitiveType.DATE:
sb.Append(@"([0-9]{2}/[0-9]{2}/[0-9]{4})");
break;
case PrimitiveType.FLOAT:
sb.Append(@"([-+]?[0-9]*\.?[0-9]+)");
break;
case PrimitiveType.INTEGER:
sb.Append(@"([0-9]+)");
break;
case PrimitiveType.STRING:
sb.Append(@"([a-zA-Z0-9]*)");
break;
}
}
sb.Append("$");
_pattern = new Regex(sb.ToString(), RegexOptions.Compiled);
Der eigentliche langsame Teil ...
public System.Text.RegularExpressions.Match Match(string input)
{
if (input == null)
throw new ArgumentNullException("input");
return _pattern.Match(input);
}
Ein typisches "_pattern" kann etwa 40 bis 50 Spalten haben. Ich erspare mir das Einfügen des gesamten Musters. Ich versuche, jeden Fall so zu gruppieren, dass ich später im Match-Objekt über jeden Fall aufzählen kann.
Irgendwelche Tipps oder Modifikationen, die drastisch helfen könnte? Oder läuft das langsam zu erwarten?
EDIT FÜR CLARITY: Sorry, ich glaube nicht, dass ich klar genug das erste Mal war.
Ich verwende eine XML-Datei regex die für ein bestimmtes Layout zu erzeugen. Ich durchlaufe dann eine Datei für einen Datenimport. Ich muss sicherstellen, dass jede Zeile in der Datei dem Muster entspricht, das es angeblich sein soll. So können Muster gegen mehrere Male überprüft werden, möglicherweise Tausende.
Sie könnten [01] für BIT versuchen. – Dave
Versuchen Sie, CSV mit diesem Regex abzugleichen? – Gumbo
Seine Tab-getrennte Ausgabe von SAS –