2008-09-29 7 views
24

Il semble que la méthode .NET Regex.Replace remplace automatiquement toutes les occurrences correspondantes. Je pourrais fournir un délégué MatchEvaluator qui renvoie la chaîne correspondante après le premier remplacement, ne rendant aucun changement, mais cela me semble très inefficace.Comment Regex rechercher/remplacer uniquement la première occurrence dans une chaîne dans .NET?

Quel est le moyen le plus efficace d'arrêter après le premier remplacement?

Répondre

27

De MSDN:

Replace(String, String, Int32) 

Au sein d'une chaîne d'entrée spécifiée, remplace un nombre maximum spécifié de chaînes qui correspondent à un modèle d'expression régulière avec une chaîne de remplacement spécifiée.

N'est ce pas ce que vous cherchez?

25

Juste pour répondre à la question initiale ... La regex suivante correspond uniquement à la première occurrence du mot foo: (! <)

(?<!foo.*)foo

Cette regex utilise le négatif lookbehind pour s'assurer qu'aucune instance de foo n'est trouvée avant celle correspondant.

3

Vous utilisiez probablement la méthode statique. Il n'y a pas de surcharge (String, String, Int32) pour cela. Construisez d'abord un objet regex et utilisez myRegex.Replace.

0

Dans ce cas, vous ne pouvez pas utiliser:

string str ="abc546_$defg"; 
str = Regex.Replace(str,"[^A-Za-z0-9]", ""); 

Au lieu de cela, vous devez déclarer nouvelle instance Regex et l'utiliser comme ceci:

string str ="abc546_$defg"; 
Regex regx = new Regex("[^A-Za-z0-9]"); 
str = regx.Replace(str,"",1) 

Notez que le , elle représente la nombre d'occurrences le remplacement devrait avoir lieu.

0

Au lieu de créer un new Regex vous pouvez également faire

Regex.Replace(originalString, "^"+pattern, stringToReplaceWith);

pour remplacer la première occurrence.

Questions connexes