2012-01-04 6 views
1

J'ai besoin d'une chaîne à vérifier et à modifier plusieurs fois (recherche et remplacement de séquences différentes) mais cela ne fonctionne pas bien. Je suppose que c'est à cause de l'immuabilité.Looping throught string - Problème d'immuabilité

private string DoRegexCheck(string line) 
{ 
    string pattern; 

    foreach (string re in this.regexPatterns.Items) 
    { 
    pattern = re; 
    Regex r = new Regex(pattern, RegexOptions.IgnoreCase); 
    line=r.Replace(line, ""); //the line should be updated and the check should continue with updated line 
    }        

    return line; 
} 
+0

Etrange, ça devrait marcher. L'invariabilité ne devrait pas être un problème: le 'Regex.Replace' créera simplement une nouvelle instance de' '** new'' chaîne' qui sera assignée à la variable 'line'. Qu'entendez-vous par * ça ne fonctionne pas bien *? Qu'est-ce qui ne va pas? –

+0

@Pavel Gatilov: ça ne remplace pas les séquences mais ça marche quand je les ai essayées une par une. – user970696

+0

Si vous voulez dire "ma ligne n'a pas changé", alors simplement: vos modèles d'expressions régulières sont faux. Le code pour mettre à jour la ligne est bien. Veuillez montrer quelques exemples de données que nous pouvons utiliser pour reproduire - c'est-à-dire un exemple de 'ligne', quelques modèles d'échantillons et la sortie désirée/réelle. –

Répondre

2

"Cela ne fonctionne pas bien" est quelque peu ambigu.

Si vous voulez dire « il n'est pas en train de changer line - alors que le code est bien immutabilité est pas un problème du tout, étant donné que nous changeons une nouvelle chaîne chaque Replace (le code affiché ne cherche pas. . modifier une chaîne existante) Si elle n'est pas mise à jour comme prévu, alors vos Regex modèles sont tout simplement incorrectes


Si vous voulez parler des performances. vous ne pouvez pas changer la façon dont Regex travaux sur cordes, je le ferais, cependant, suggérer de mettre en cache les différentes regex en utilisant l'option Compiled, de sorte que vous ayez un tableau ou un dictionnaire de pré-compilation d Regex que vous réutilisez. Ceci est particulièrement important si vous l'appliquez pour des milliers de line s.

+0

Je sais, j'ai juste besoin de la chaîne "line" pour être vraiment mis à jour à chaque itération. Je pense que ça n'a pas d'importance qu'il y ait une regex, ce serait la même chose avec n'importe quelle autre action de modification de corde. – user970696

+0

@ user970696 au contraire; il est très important que ce soit 'Regex' car chaque' Regex.Replace' * prend * a 'string' et * renvoie * une chaîne (souvent différente)'. Certaines autres API peuvent prendre un caractère "char *" ou "StringBuilder". 'Regex' ne fait pas. Cependant, je pense qu'il est prématuré de conculter que l'immuabilité des cordes est le problème. Quel est le symptôme? Tout ce que vous nous avez dit, c'est "ne fonctionne pas bien". Si vous voulez dire la performance, le temps de traitement de ces 'Regex' sans pré-compilation devrait largement dépasser l'immutabilité' string '. Fixez cela en premier. –