Estoy generando expresiones regulares de forma dinámica ejecutando algunas estructuras xml y construyendo la declaración mientras disparo a través de sus tipos de nodos. Estoy usando esta expresión regular como parte de un tipo de diseño que definí. Luego analizo a través de un archivo de texto que tiene un Id al principio de cada línea. Esta identificación me señala un diseño específico. Luego trato de hacer coincidir los datos en esa fila con su expresión regular.¡Las expresiones regulares dinámicamente construidas se están ejecutando extremadamente lento!
Suena bien y dandy ¿no? El único problema es que las cadenas coincidentes son extremadamente lentas. Los tengo configurados como compilados para intentar acelerar un poco las cosas, pero fue en vano. Lo desconcertante es que estas expresiones no son tan complejas. No soy de ninguna manera un gurú de RegEx, pero sé un cantidad decente sobre ellos para que las cosas funcionen bien.
Aquí está el código que genera las expresiones ...
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);
La parte lenta real ...
public System.Text.RegularExpressions.Match Match(string input)
{
if (input == null)
throw new ArgumentNullException("input");
return _pattern.Match(input);
}
A "_pattern" típica puede tener unos 40-50 columnas. Guardaré de pegar todo el patrón. Intento agrupar cada caso para poder enumerar cada caso en el objeto Match más adelante.
¿Alguna sugerencia o modificación que podría ayudar drásticamente? ¿O esto es lento para ser esperado?
EDITAR POR CLARIDAD: Lo siento, no creo que haya sido lo suficientemente claro la primera vez.
Utilizo un archivo xml para generar expresiones regulares para un diseño específico. Luego reviso un archivo para importar datos. Necesito asegurarme de que cada línea en el archivo coincida con el patrón que dice que se supone que es. Por lo tanto, los patrones se pueden comparar varias veces, miles posibles.
Puede probar [01] para BIT. – Dave
¿Está tratando de hacer coincidir CSV con esta expresión regular? – Gumbo
Su salida delimitada por tabulaciones desde SAS –