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 doubles autour de SomeInformationHere pour que le résultat ressemble à celui ci-dessous, mais les guillemets autour du mot "formateur" doivent rester.
"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 :
string pattern = "\"formatter\": ([\"]).*([\"])";
Match match = Regex.Match(myString, pattern, RegexOptions.IgnoreCase);
//Replace text in "myString" here
myString = ?????
//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 au site de testeur de regex (merci pour le lien) et collé dans ma chaîne de test et mon motif de regex, cela semble fonctionner, mais lorsque je mets le même motif dans dot net, le remplacement semble fonctionner comme si l'option "ligne unique" a été sélectionnée. Ci-dessous le code que j'ai utilisé.
La chaîne - notez qu'elle ne contient PAS de retour à la ligne - c'est une longue chaîne qui a été construite à 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<\/b>: \u0027+ this.y +\u0027 %\u0027;}"
},
"title": {
"align": "center",
"text": "Your chart title here"
},
"tooltip": {
"formatter": "function(){return \u0027\u0027+ this.point.name +\u0027<\/b>: \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 quand la chaîne ci-dessus est sur plusieurs lignes (avec des CR) dans le testeur, mais quand je la mets sur UNE ligne comme il se doit, alors le motif ne fonctionne pas
Le code/modèle .NET que j'utilise est:
string 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<\/b>: \u0027+ this.y +\u0027 %\u0027;}" }, "title": {"align": "center", "text": "Your chart title here" }, "tooltip": {"formatter": "function(){return \u0027\u0027+ this.point.name +\u0027<\/b>: \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.
modèle de chaîne = "(\" 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 Groupes de capture nommés et Substitutions
static void Main(string[] 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 String ReFormat(String str) {
//Use named capturing groups to make life easier
var pattern = "(?<label>\"formatter\"): ([\"])(?<tag>.*)([\"])";
//Create a substitution pattern for the Replace method
var replacePattern = "${label}: ${tag}";
return Regex.Replace(str, pattern, replacePattern, RegexOptions.IgnoreCase);
}
Vous pouvez utiliser la méthode Regex.Replace comme ceci:
string pattern = "\"formatter\": \"(.*)\"";
myString = Regex.Replace(myString, pattern, "\"formatter\": $1");
Utilisez ceci:
string longString = @"""formatter"": ""SomeInformationHere""";
string pattern = "(\"formatter\": )([\"])(.*)([\"])";
string result = Regex.Replace(longString, pattern, "$1$3");
Ceci remplace toutes les correspondances trouvées par les deuxième et quatriè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 le regex utilisé 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 gourmandise (Vérifiez les expressions rationnelles vs les expressions rationnelles paresseuses) .
"\"formatter\": ([\"]).*([\"])"
à
"\"formatter\": ([\"]).*?([\"])"
var pattern = @"^(\s*""formatter""\s*:\s*)[""](.*)[""](\s)*$";
var regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.Multiline);
myString = regex.Replace(myString, "$1$2$3");