J'ai un problème particulier ..!
J'ai une chaîne avec une valeur constante à plusieurs pas. Par exemple, considérez la piqûre suivante. P> maintenant, je veux remplacer chacun des TMP em> dans la chaîne avec des valeurs stockées dans une matrice, Premier TMP em> contient le tableau [0], seconde TMP em> contient le tableau [1] et ainsi de suite ... P> aucune idée de la manière dont cela peut être atteint. .? J'utilise c # 2.0 p> p>
4 Réponses :
Vous pouvez utiliser un matchlevaluator (une fonction qui est appelée à faire chaque remplacement), quelques exemples ici: P>
http://msdn.microsoft.com /en-us/library/aa332127%28Vs.71%29.aspx P>
suggestion, vous pouvez utiliser string.split () à scinder sur "TMP". Ensuite, itérale la liste des articles écartés et imprimez-les + les valeurs de matrice, par exemple une idée de pseudocode uniquement
Que diriez-vous:
string result = rx.Replace(input, delegate(Match m) { return array[index++]; });
Chapeau à vous .. exactement la même chose que je voulais. Mais comment ça fonctionne? Vous avez une expression Lambda M => Array [Index ++], comment cela sert-t-il?
@Amit: le délégué Lambda ou anonyme Prenez la place du Matchevaluator code>. Chaque correspondance trouvée est remplacée par un élément du tableau. Donc la 1ère correspondance est remplacée par tableau [0] puis index ++ code> définira index code> sur 1, puis la correspondance suivante sera avancée à la valeur du tableau [1] et donc en avant.
@Ahmad: merci beaucoup .. Laissez-moi explorer plus sur le même ..! J'ai 3,5 cadre installé sur ma machine, l'expression de la Lambda a fonctionné bien sur un projet pointé vers 2.0 Cadre ..!
@Amit: Martin Booth a fait un très bon point de son poste ci-dessous. La vraie raison du délégué est de capturer la variable code> index code> de sorte qu'elle puisse être avancée correctement pour chaque match. Si j'avais utilisé Array [index ++] code> seul, il aurait été évalué une fois et utilisé valeur1 code> à plusieurs reprises, contrairement à l'objectif de la question. Vous voudrez peut-être vous référer à l'article de Jon Skeet sur les fermetures pour plus de détails: CSKARPINDEPTH.COM/Articles/Chapter5 /Closures.aspx
@Ahmadmageed, juste une question. Êtes-vous sûr que cet ordre d'énumération des matchs dans matchevaluator code> que vous avez fourni sera strict de gauche à droite? En d'autres termes, si la méthode de la délégation invoquera pour la deuxième match, puis pour le premier match, par exemple. Dans ce remplacement de cas hypothétique, il sera mal effectué. Je comprends que de gauche au bon débit est courante pour la mise en œuvre de regex, mais cependant, et si? Si vous avez des liens pouvant dissiper mes doutes, pourriez-vous leur fournir.
Je penserais que la première solution d'Ahmad Mageed est celle à utiliser car [Index ++] n'est évalué qu'une fois lorsqu'il est passé dans la méthode Rx.replace .. P>
Je l'ai également compilé pour vérifier si je le comprends correctement ou non, et assurez-vous que cela produit la sortie suivante: P>
Bonjour valeur1 Comment est la valeur1 ceci Valeur possible1 en C # ...? P> blockQuote>
Le comportement a-t-il changé avec les versions ultérieures du cadre? Ou suis-je trompé en pensant que la production attendue devrait être: p>
bonjour value1 Comment est la valeur2 this Valeur possible3 en C # ...? P> blockQuote>
+1 à vous, excellent point. Vous avez absolument raison, il est trop tard ici :) Ma première solution fonctionne car l'index est une valeur capturée. Rouler ma réponse maintenant pour refléter cela.
@Martin: Votre attente est correcte. Qui correspond à ma réponse originale. Le comportement est inchangé dans les cadres que j'ai utilisé array [index ++] code> directement comme je l'ai fait avant que j'ai roulé ma réponse à votre réponse. Cela donne de la valeur1 encore et encore. La raison pour laquelle la 2e approche a fonctionné est que la variable index code> est capturée par le délégué. Voir l'article de Jon Skeet sur les fermetures Pour plus d'informations: CSKARPIDEPTH.COM/Articles/Chapter5/closures.aspx < / a>