匹配和替换

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

"formatter": "SomeInformationHere" 

我需要在long字符串中找到上面的文本并删除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:

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

  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: \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;}" } } 

正如你可以看到“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: \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;}" } } 

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

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

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

这里使用的主要两件事是命名捕获组和替换

 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 = "(? 

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

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

用这个:

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

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

最有可能“ 替换似乎工作就好像”单线“选项被选中 ”因为你最初使用的正则表达式将正确匹配到第14个符号

 **"formatter": "SomeInformationHere"** 

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

 "\"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");