2009-03-29 9 views
3

si j'ai une chaîne comme ça « Bonjour - Monde - Bonjour tout le monde »C# Regex Remplacer Question

Je veux remplacer les caractères de la première instance PRÉCÉDANT de la sous-chaîne « - »

par exemple afin de remplacer ce qui précède avec "SUPERDOOPER" laisserait: "SUPERDOOPER - Monde - Bonjour tout le monde"

Jusqu'à présent, je suis arrivé ceci: "^ [^ -] * -"

Mais ce qui comprend le "-" qui est faux.

comment faire cela avec regex s'il vous plaît?

Répondre

3

Utilisez un non-capturing group, qui regarde en avant du modèle pour vérifier la correspondance, mais n'inclut pas ces caractères dans le match lui-même.

(^[^-]*)(?: -) 

Edit: après avoir réfléchi à nouveau, qui semble un peu redondant. Ne serait-ce travail ?:

^[^-]* 

Obtient tous les caractères non-tiret entre le début de la chaîne et continue jusqu'à ce qu'il frappe un tableau de bord? Ou avez-vous besoin d'exclure l'espace aussi? Si oui, rendez-vous avec le premier.

+0

groupe non-capture ne crée pas un groupe, mais comprendra que sa partie dans le tout le match (groupe # 0). Donc, votre premier exemple ne fonctionnera pas. – Rorick

0

Ne pourriez-vous faire exactement cela?

Regex.Replace ("World - Bonjour tout le monde", "^ [^ -] * -", "SUPERDOOPER -");

0
Regex.Replace(input, @"(Hello)(-.*\1)", @"SUPERDOOPER$2"); 
0

Le motif: - (. - +) ([^] +)

expression première correspond à une série de caractères non compris un tiret. Ensuite, il y a un espace. deuxième expression commence par un tiret et un espace, suivi d'une série d'un ou plusieurs « tout » caractères.

Le remplacement: "Superdooper $ 2"

délivre Superdooper - Monde - Bonjour tout le monde

0

Vous pouvez essayer d'utiliser avec regex avant positive: "^[^-]*(?= -)". Autant que je sache, C# le supporte. Cette expression rationnelle correspond à exactement ce que vous voulez. Vous pouvez en savoir plus sur lookahead, look-behind et d'autres techniques regex avancées dans le célèbre livre "Mastering Regular Expressions".

1

Pourquoi vous pensez-vous que besoin d'utiliser une expression régulière pour une opération de chaîne comme celui-ci?

C'est plus simple et plus efficent:

str = "SUPERDOOPER" + str.Substring(str.IndexOf(" -")); 
+0

Merci Guffa, c'est la solution que je suis allé avec. Merci à tous les autres pour leurs réponses aussi. J'ai beaucoup appris de ce post. À votre santé! –