C# 匹配和替换

C# 匹配和替换,c#,regex,C#,Regex,我有一个长字符串,在该字符串中,我有以下文本: "formatter": "SomeInformationHere" 我需要在长字符串中找到上面的文本,并删除SomeInformationHere周围的双引号,因此结果如下所示,但单词“formatter”周围的引号必须保留 "formatter": SomeInformationHere 我尝试了以下方法,找到了字符串,但我不确定如何仅替换值SomeInformationHere周围的引号: string pattern = "\"form

我有一个长字符串,在该字符串中,我有以下文本:

"formatter": "SomeInformationHere"
我需要在长字符串中找到上面的文本,并删除SomeInformationHere周围的双引号,因此结果如下所示,但单词“formatter”周围的引号必须保留

"formatter": SomeInformationHere
我尝试了以下方法,找到了字符串,但我不确定如何仅替换值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);
编辑:哦,我忘了提到上面的模式可能不止一次出现在“mystring”中,所有这些模式都需要替换它们


编辑2:

我已经查看了regex测试站点(感谢链接),并粘贴了我的测试字符串和regex模式,这似乎是可行的,但当我将相同的模式放入dot net时,替换似乎就好像选择了“单线”选项一样有效。下面是我使用的代码

  • 字符串-请注意,它不包含任何回车符-它是一个从XML文件生成的长字符串。为可读性而格式化

    {
            "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;}"
            }
    }
    
    再次感谢。但我似乎仍然无法在测试仪中使模式正常工作

    正则表达式测试站点中的目标字符串:(无CRs)

    {chart:{“borderRadius”:15,“borderWidth”:1,“renderTo”:“ChartContainer1”,“type”:“pie”},“credits”:{“enabled”:false},“labels”:{“items”:[{“html”:“Label 1”,“style”:{“left”:“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”:“浏览器共享”}dummy“:null}],“test”:“{”格式化程序“:“function(){return\u0027\u0027+this.point.name+\u0027:\u0027+this.y+\u0027%\u0027;}”,title:{”align:“center”,“text:“Your chart title here”},“tooltip:“{”格式化程序“:“function(){return\u0027\u0027+this.point.name+\u0027:\u0027+this.y+\u0027%\u0027;}”
    

    我现在已经找到了正确的模式,并且在字符串中找到了多个匹配项

    字符串模式=“(\”格式化程序\“:)\”(.[^\“]*)\”

    使用以下命令:

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

    这将用匹配的第二和第四个子组替换找到的所有匹配项。完全匹配的是第一个子组(
    $0
    ),括号中的所有部分将创建一个新的子组。

    您可以使用正则表达式。替换方法如下:

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

    其他人几乎都使用了捕获组和替换,只是想提供更多的上下文:

    这里使用的主要两件事是和

    static void Main(字符串[]args){
    var输入=新[]{
    ““格式化程序”:“约翰”,
    “\'formatter\”:“Sue\”,
    ““格式化程序”:“格雷格”
    };
    foreach(输入中的var s){
    System.Console.Write(“原始:[{0}]{1}”,s,Environment.NewLine);
    System.Console.Write(“替换:[{0}]{1}”,重新格式化,Environment.NewLine);
    System.Console.WriteLine();
    }
    System.Console.ReadKey();
    }
    私有静态字符串重新格式化(字符串str){
    //使用命名的捕获组使生活更轻松
    var pattern=“(?\“格式化程序\”):([\”])(?*([\”])”;
    //为Replace方法创建替换模式
    var replacePattern=“${label}:${tag}”;
    返回Regex.Replace(str,pattern,replacePattern,RegexOptions.IgnoreCase);
    }
    
    最有可能的是“替换似乎就像选择了“singleline”选项一样工作”,因为您最初使用的正则表达式将正确匹配到中的第14个符号

    **"formatter": "SomeInformationHere"**
    
    ,但在此之后,它将匹配任何符号,无论它是什么,包括下一次出现的双引号,它将继续直到第一个新行。这就是。*表达式的工作原理,因为它是贪婪的(检查贪婪与懒惰的正则表达式)。 所以我想你只需要修改一下

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


    它总是以“格式化程序”开头还是完全不同?是测试正则表达式的极好工具。如果你还不知道的话。我试过你的表情,但没用。我不得不转义所有的双引号,而且它也无法解析“formatter”:“show information”在“formatter”^(\s*\“formatter\”:\s*)[\”](.*)[\”](\s)*$@Doug Chamberlain:当然,当你想在测试仪中测试它时,你必须将双引号设为单引号——它们以字符串形式转义,这就是为什么它们是双引号的原因。实际的正则表达式是
    ^(\s*“格式化程序”:\s*)[“](.*)[“](\s)*$
    。它在.net中工作,经过测试。但是你是对的,
    formatter
    后面的空格丢失了,我已经更新了正则表达式。另外,
    多行
    ^
    $
    对于每对都在单行上的场景来说是安全的,并且不会像其他答案那样引起可能的冲突。此外,您必须在测试工具中检查多行。
    var pattern = @"^(\s*""formatter""\s*:\s*)[""](.*)[""](\s)*$";
    var regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.Multiline);
    myString = regex.Replace(myString, "$1$2$3");
    
    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);
    }
    
    **"formatter": "SomeInformationHere"**
    
    "\"formatter\": ([\"]).*([\"])"
    
    "\"formatter\": ([\"]).*?([\"])"