Je veux utiliser une expression régulière de la même manière que String.Format. Je vais expliquer
J'ai: p> cela fonctionne, mais je dois fournir "l'entrée" à regex.replace. Je ne veux pas ça. Je souhaite utiliser le motif pour la correspondance, mais également pour créer des chaînes de la même manière que pour le format de chaîne, remplacez le groupe nommé «ID» avec la valeur. Est-ce que cela est possible? P> Je cherche quelque chose comme: p> résultat contiendra "ABC_999_DEF". Comment accomplir cela? P> p>
8 Réponses :
Non, il n'est pas possible d'utiliser une expression régulière sans fournir d'entrée. Il doit avoir quelque chose à travailler avec, le motif ne peut pas ajouter de données au résultat, tout doit provenir de l'entrée ou du remplacement.
Obtenir d'utiliser String.Format, vous pouvez utiliser un look de derrière et un look en avance pour spécifier la pièce entre "abc_" et "_def" et remplacez-le: p>
Pourquoi le bowvote? Si vous n'expliquez pas ce que vous pensez être faux, cela ne peut pas améliorer la réponse.
Voir la réponse et commentaire de User1817787
La meilleure réponse n'est pas ce message, mais ce un .
Oui, il est possible:
Regex regex = new Regex("^(?<PREFIX>abc_)(?<ID>[0-9]+)(?<POSTFIX>_def)$");
string oldValue = "abc_123_def";
var result = oldValue.Replace(regex, "ID", "456");
Ne faites pas votre jimmies si brutaillés.
Non, il n'est pas possible d'utiliser une expression régulière sans fournir d'entrée. Vous fournissez une entrée dans le code de votre réponse, de sorte qu'il ne démontre pas ce que vous prétendez.
Vous devez comprendre ce qu'il veut, au lieu de le frapper sur son erreur. Regardez le titre: «Remplacez le groupe nommé dans Regex avec la valeur», regardez votre réponse, où est le groupe nommé? Regardez son échantillon: "RemplacerWithFormat (motif," ID ", 999);". Il veut clairement remplacer l'actuel "ID" avec 999. Regardez son résultat attendu: "ABC_999_DEF". Il veut remplacer le groupe nommé "ID" dans "ABC_123_DEF" avec 999 et recevoir "ABC_999_DEF". Dire que ce n'est pas possible ne vous aide pas du tout. De plus, votre exemple de code ne fait pas ce qu'il veut.
Il y avait un problème dans l'utilisateur1817787 Réponse et je devais procéder à une modification de la fonction remplaNameDgroup code> comme suit. private static string ReplaceNamedGroup(string input, string groupName, string replacement, Match m)
{
string capture = m.Value;
capture = capture.Remove(m.Groups[groupName].Index - m.Index, m.Groups[groupName].Length);
capture = capture.Insert(m.Groups[groupName].Index - m.Index, replacement);
return capture;
}
@Jobadiniz Il a édité sa réponse pour inclure la mienne. Voir Stackoverflow.com/posts/13342795/Revisions
Une autre version éditée de la méthode d'origine par @ user1817787, celle-ci
Si la longueur de remplacement est différente de la longueur de la capture, elle jettera les index après le premier rejet / insert.
@ user1620220 J'ai supposé remplacer des caractères uniques avec des caractères simples comme dans l'exemple de la question 123 ==> 999. E.G. pour masquer les données sensibles.
La solution simple consiste à désigner les groupes appariés en remplacement. Donc, le préfixe est Je n'ai pas testé le code ci-dessous mais que vous devez travailler similaire à un 1 $ code> et postfix est 3 $ code>. Regex code > J'ai récemment écrit: p>
J'ai raccourci remplacéRenamePgroup, soutenant toujours plusieurs captures.
private static string ReplaceNamedGroup(string input, string groupName, string replacement, Match m)
{
string result = m.Value;
foreach (Capture cap in m.Groups[groupName]?.Captures)
{
result = result.Remove(cap.Index - m.Index, cap.Length);
result = result.Insert(cap.Index - m.Index, replacement);
}
return result;
}
Vous devriez vérifier la documentation sur REGEX remplacer Ici
J'ai créé ceci pour remplacer un groupe nommé. Je ne peux pas utiliser une solution qui boucle sur tous les groupes Nom, car j'ai un cas où toute expression n'est pas regroupée. P>
Si cela aide tout le monde, j'ai amélioré la réponse avec la possibilité de remplacer plusieurs groupes de capture nommés en une fois, ce que cette réponse a aidé massivement à atteindre.
var regex = new Regex(@"C={BasePath:""(?<basePath>[^\""].*)"",ResultHeadersPath:""ResultHeaders"",CORS:(?<cors>true|false)");
content = content.Replace(regex, new Dictionary<string, string>
{
{ "basePath", "www.google.com" },
{ "cors", "false" }
};
Ce n'est pas exactement ce que vous recherchez, mais peut être utile. C'est fondamentalement une chaîne nommée.format, au lieu d'indexée. Haacked. Com / Archive / 2009/01/04 / ...