web-dev-qa-db-fra.com

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 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é.

  1. 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\":) \" (. [^\"] * ) \" ";

26
Harag

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);
}
25
Josh

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

string pattern = "\"formatter\": \"(.*)\"";
myString = Regex.Replace(myString, pattern, "\"formatter\": $1");
14
rusty

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.

3
Daniel Hilgarth

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\": ([\"]).*?([\"])"
1
0xC0DEGURU
var pattern = @"^(\s*""formatter""\s*:\s*)[""](.*)[""](\s)*$";
var regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.Multiline);
myString = regex.Replace(myString, "$1$2$3");
0