Match et remplacer

J’ai une longue chaîne et dans cette chaîne, j’ai le texte suivant:

"formatter": "SomeInformationHere" 

Je dois trouver le texte ci-dessus dans la chaîne longue et supprimer les guillemets entourant SomeInformationHere pour obtenir le résultat ci-dessous, mais les guillemets entourant le mot “formateur” doivent restr.

 "formatter": SomeInformationHere 

J’ai essayé ci-dessous, qui trouve la chaîne, mais je ne suis pas sûr de savoir comment remplacer uniquement les guillemets autour de la valeur SomeInformationHere :

 ssortingng pattern = "\"formatter\": ([\"]).*([\"])"; Match match = Regex.Match(mySsortingng, pattern, RegexOptions.IgnoreCase); //Replace text in "mySsortingng" here mySsortingng = ????? //Output match value: Response.Write(match.Value); 

Edit: Oh, j’ai oublié de mentionner que le motif ci-dessus pourrait être “mystérieux” plus d’une fois et que tous devront être remplacés.


Edit 2:

J’ai jeté un œil sur le site du testeur de regex (merci pour le lien) et l’avoir collée dans ma chaîne de test et mon motif de regex, cela semble fonctionner en cela, mais lorsque je mets le même motif dans dot net, le remplacement semble fonctionner si l’option “ligne individuelle” a été sélectionnée. Ci-dessous le code que j’ai utilisé.

  1. La chaîne – notez qu’elle ne contient PAS de retour à la ligne – est une chaîne longue qui a été créée à partir d’un fichier XML. Formaté pour la lisibilité.

     { "chart": { "borderRadius": 15, "borderWidth": 1, "renderTo": "ChartContainer1", "type": "pie" }, "credits": { "enabled": false }, "labels": { "items": [{ "html": "Label 1", "style": { "left": "10px", "top": "30px" } }, { "html": "Label 2", "style": { "left": "10px", "top": "50px" } }, { "dummy": null }] }, "plotOptions": { "pie": { "allowPointSelect": true, "cursor": "pointer", "showInLegend": true } }, "series": [{ "data": [{ "name": "Firefox", "y": 45.0 }, { "name": "IE", "y": 26.8 }, { "name": "Chrome", "selected": true, "sliced": true, "y": 12.8 }, { "name": "Safari", "y": 8.5 }, { "name": "Opera", "y": 6.2 }, { "name": "Others", "y": 0.7 }], "name": "Browser share" }, { "dummy": null }], "test": { "formatter": "function(){return \u0027\u0027+ this.point.name +\u0027: \u0027+ this.y +\u0027 %\u0027;}" }, "title": { "align": "center", "text": "Your chart title here" }, "tooltip": { "formatter": "function(){return \u0027\u0027+ this.point.name +\u0027: \u0027+ this.y +\u0027 %\u0027;}" } } 

Comme vous pouvez le voir en bas à côté de “test” et “info-bulle”, j’ai la partie “formateur:”. le patten que j’utilise actuellement fonctionne lorsque la chaîne ci-dessus est sur plusieurs lignes (avec des CR) dans le testeur, mais lorsque je la mets sur UNE ligne comme il se doit, le motif ne fonctionne pas

Le code / modèle .NET que j’utilise est:

 ssortingng pattern = "(\"formatter\": )\"(.*)\"( })"; var regex = new Regex(pattern, RegexOptions.IgnoreCase); aJSON = regex.Replace(aJSON, "$1$2$3"); 

Merci encore. mais je n’arrive toujours pas à faire en sorte que le motif fonctionne correctement dans le testeur.

Chaîne cible dans le site du testeur REGex: (sans CR)

 {"chart": {"borderRadius": 15, "borderWidth": 1, "renderTo": "ChartContainer1", "type": "pie" }, "credits": {"enabled": false }, "labels": { "items": [ {"html": "Label 1", "style": {"left": "10px", "top": "30px" } }, {"html": "Label 2", "style": {"left": "10px", "top": "50px" } }, {"dummy": null } ] }, "plotOptions": {"pie": {"allowPointSelect": true, "cursor": "pointer", "showInLegend": true } }, "series": [ { "data": [ {"name": "Firefox", "y": 45.0 }, {"name": "IE", "y": 26.8 }, {"name": "Chrome", "selected": true, "sliced": true, "y": 12.8 }, {"name": "Safari", "y": 8.5 }, {"name": "Opera", "y": 6.2 }, {"name": "Others", "y": 0.7 } ], "name": "Browser share" }, {"dummy": null } ], "test": {"formatter": "function(){return \u0027\u0027+ this.point.name +\u0027: \u0027+ this.y +\u0027 %\u0027;}" }, "title": {"align": "center", "text": "Your chart title here" }, "tooltip": {"formatter": "function(){return \u0027\u0027+ this.point.name +\u0027: \u0027+ this.y +\u0027 %\u0027;}" } } 

J’ai maintenant trouvé le bon motif qui semble fonctionner et j’ai trouvé plusieurs correspondances dans la chaîne. Afficher ici pour l’achèvement.

ssortingng pattern = “(\” formateur \ “:) \” (. [^ \ “] * ) \” “;

Tout le monde a bien compris en utilisant des groupes de capture et des substitutions, je voulais juste fournir un peu plus de contexte:

Les deux principaux éléments utilisés ici sont les groupes de capture nommés et les substitutions.

 static void Main(ssortingng[] args) { var input = new[] { "\"formatter\": \"John\"", "\"formatter\": \"Sue\"", "\"formatter\": \"Greg\"" }; foreach (var s in input) { System.Console.Write("Original: [{0}]{1}", s, Environment.NewLine); System.Console.Write("Replaced: [{0}]{1}", ReFormat(s), Environment.NewLine); System.Console.WriteLine(); } System.Console.ReadKey(); } private static Ssortingng ReFormat(Ssortingng str) { //Use named capturing groups to make life easier var pattern = "(? 

Vous pouvez utiliser la méthode Regex.Replace comme ceci:

 ssortingng pattern = "\"formatter\": \"(.*)\""; mySsortingng = Regex.Replace(mySsortingng, pattern, "\"formatter\": $1"); 

Utilisez ceci:

 ssortingng longSsortingng = @"""formatter"": ""SomeInformationHere"""; ssortingng pattern = "(\"formatter\": )([\"])(.*)([\"])"; ssortingng result = Regex.Replace(longSsortingng, pattern, "$1$3"); 

Ceci remplace toutes les correspondances trouvées par les deuxième et quasortingème sous-groupes de la correspondance. La correspondance complète est le premier sous-groupe ( $0 ) et toutes les parties entre parenthèses créent un nouveau sous-groupe.

Probablement ” le remplacement semble fonctionner comme si l’option” ligne unique “avait été sélectionnée ” car la regex utilisée initialement correspondra correctement jusqu’au 14ème symbole de

 **"formatter": "SomeInformationHere"** 

, mais après cela, chaque symbole indiquera ce qu’il est, y compris la première occurrence de guillemets, et il continuera jusqu’à la première nouvelle ligne. C’est comme ça que. * Expression fonctionne à cause de sa cupidité (Check greedy vs lazy regex). Donc, je suppose que vous n’avez qu’à modifier

 "\"formatter\": ([\"]).*([\"])" 

à

 "\"formatter\": ([\"]).*?([\"])" 
 var pattern = @"^(\s*""formatter""\s*:\s*)[""](.*)[""](\s)*$"; var regex = new Regex(pattern, RegexOptions.Comstackd | RegexOptions.Multiline); mySsortingng = regex.Replace(mySsortingng, "$1$2$3");