Ho una situazione in cui le mie espressioni regolari vengono compilate estremamente lentamente su Windows Server 2008. Ho scritto una piccola applicazione console per evidenziare questo problema. L'app genera il proprio input e crea un Regex da parole in un file XML. Ho creato una versione di rilascio di questa app e l'ho eseguita sia sul mio laptop personale (con XP in esecuzione) che sul server Windows 2008. L'espressione regolare ha richiesto 0,21 secondi per la compilazione sul mio portatile, ma 23 secondi per la compilazione sul server.Regex lento su Windows Server 2008
Qualche idea che cosa potrebbe causare questo? Il problema è solo al primo utilizzo del Regex (quando viene compilato per la prima volta - quindi va bene)
Ho anche trovato un altro problema - quando si utilizza \s+
nell'espressione regolare sullo stesso server Windows 2008, i palloncini di memoria (usa 4 GB +) e la compilazione del Regex non finisce mai.
C'è un problema noto con Regex e 64 bit .net? C'è una correzione/patch disponibile per questo? Non riesco a trovare alcuna informazione in rete, ma ho trovato alcuni articoli su questo stesso problema in Framework 2.0 - sicuramente questo è stato risolto?
Altre informazioni: Il server sta eseguendo la versione a 64 bit del framework .net (3.5 SP1) e sul mio computer portatile ho Visual Studio 2008 e il framework 3.5 installato. L'espressione regolare è il seguente schema: ^word$|^word$|^word$
ed è costruito con i seguenti flag: RegexOptions.IgnoreCase | RegexOptions.Compiled
Ecco un frammento di codice:
StringBuilder regexString = new StringBuilder();
if (!String.IsNullOrEmpty(fileLocation))
{
XmlTextReader textReader = new XmlTextReader(fileLocation);
textReader.Read();
while (textReader.Read())
{
textReader.MoveToElement();
if (textReader.Name == "word")
{
regexString.Append("^" + textReader.GetAttribute(0) + "$|");
}
}
ProfanityFilter = new Regex(regexString.ToString(0, regexString.Length - 1), RegexOptions.IgnoreCase | RegexOptions.Compiled);
}
DateTime time = DateTime.Now;
Console.WriteLine("\nIsProfane:\n" + ProfanityFilter.IsMatch("test"));
Console.WriteLine("\nTime: " + (DateTime.Now - time).TotalSeconds);
Console.ReadKey();
Ciò si traduce in un tempo di 0,21 secondi sul mio portatile e 23 secondi sul server 2008. Il file XML si compone di 168 parole del seguente formato:
<word text="test" />
Come su esempio di codice, per regex e xml? –