匹配和替换

时间:2011-05-05 14:53:34

标签: c# regex

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

"formatter": "SomeInformationHere"

我需要在长字符串中找到上面的文字并删除 SomeInformationHere 周围的双引号,所以结果如下所示,但是“formatter”一词的引号必须保留。< / p>

"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:

我已经看过正则表达式测试站点(感谢链接)并粘贴在我的测试字符串和正则表达式模式中,它似乎可以工作,但当我将相同的模式放入点网时,替换似乎就像选择了“单行”选项一样工作。以下是我用过的代码。

  1. 字符串 - 请注意,它不包含任何回车符 - 它是一个从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;}"
            }
    }
    
  2. 正如你可以看到“test”和“tooltip”旁边的底部附近,我有“formatter:”部分。我正在使用的模式当上面的字符串全部在测试器中的几行(带有CR)时起作用,但是当我将它放在一行时它应该是那样的模式并不起作用

    我正在使用的.NET代码/模式是:

    string pattern = "(\"formatter\": )\"(.*)\"( })";
    var regex = new Regex(pattern, RegexOptions.IgnoreCase);
    aJSON = regex.Replace(aJSON, "$1$2$3");
    
    再次感谢。但我仍然无法让模式在测试仪中正常工作。

    REGex测试站点中的目标字符串:(没有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;}" } }
    

    我现在找到了正常的模式,似乎可以工作并在字符串中找到多个匹配项。将其发布在此处以便完成。

      

    string pattern =“(\”formatter \“:)\”(。 [^ \“] * )\”“;

5 个答案:

答案 0 :(得分:26)

其他人几乎已经使用捕获组和替换进行了固定,只是想提供更多的上下文:

此处使用的主要两件事是Named Capturing GroupsSubstitutions

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

答案 1 :(得分:15)

您可以像这样使用Regex.Replace方法:

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

答案 2 :(得分:3)

使用此:

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

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

答案 3 :(得分:1)

很可能“替换似乎就像选择了”单行“选项一样”因为你的正则表达式最初使用的正确匹配到

中的第14个符号
**"formatter": "SomeInformationHere"**

,但之后它将匹配每个符号nomatter它是什么,包括下一个双引号出现,它将继续直到第一个新行。这就是。*表达式因为它的贪婪而起作用(检查贪婪与懒惰的正则表达式)。 所以我想你只需修改

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

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

答案 4 :(得分:0)

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