2011-05-05 122 views
25

我有一个很长的字符串和内该字符串我有以下文字:匹配和替换

"formatter": "SomeInformationHere" 

我需要找到一长串内上面的文字,并删除周围双引号SomeInformationHere所以结果如下图所示,但“格式化程序”一词的引号必须保留。

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

正如你可以靠近底部旁边的“测试”和“工具提示”看我有“格式化”的一部分。我正在使用的图案当上面的字符串全部在测试仪中的几行(带有CR)时,但是当我把它放在一条线上时它应该是那么图案不起作用

。我使用的NET代码/模式是:

string pattern = "(\"formatter\":)\"(.*)\"(})"; 
var regex = new Regex(pattern, RegexOptions.IgnoreCase); 
aJSON = regex.Replace(aJSON, "$1$2$3"); 

再次感谢。但我仍然无法使模式在测试仪中正常工作。

目标字符串中的正则表达式测试网站(无CRS)

{"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;}" } } 

我现在发现,似乎工作,并找到字符串中的多个匹配正确的模式。在这里发布完成。

串图案= “(\” 格式化\ “:)\”(。[^ \ “] *)\”“;

+0

是否总是与'“格式化”开始'也可以是完全不同的东西? – 2011-05-05 15:08:26

+3

http://regexhero.net/tester/是一个很棒的工具来测试正则表达式。如果你还不知道。 – 2011-05-05 15:23:09

回答

22

其他人都已经几乎使用捕获组和替换钉它,只是想提供一点更多的背景:

在此处使用的主要有两件事是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); 
} 
3

使用此:

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

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

13

可以使用Regex.Replace方法是这样的:

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

我在http://regexhero.net/tester/上试了一下你的表达,但没有奏效。我不得不逃避所有双引号,也无法解析“格式化程序”:“显示信息”,在“格式化程序”之后有额外的空间 ^(\ s * \“formatter \”:\ s *)[\“ ](。*)[\“](\ s)* $ – 2011-05-05 15:19:47

+0

@Doug Chamberlain:当然,如果您想在测试程序中测试它,您必须使双引号单一 - 它们会以字符串形式进行转义,这就是为什么它们是双倍的。实际的正则表达式是'^(\ s *“formatter”:\ s *)[“](。*)[”](\ s)* $'。它在.net中工作,经过测试。但你说得对,'formatter'后面的空格不见了,我更新了正则表达式。另外'Multiline'和'^'和'$'可以保证每对都在单线上并且不会像其他答案一样导致可能的冲突的情况。 – 2011-05-05 15:27:13

+0

另外,您必须在测试工具中检查* Multiline *。 – 2011-05-05 15:28:45

1

最有可能“更换看来,如果工作‘单线’选项已经被选中”东阳最初使用你的正则表达式匹配正确达14符号

**"formatter": "SomeInformationHere"** 

,但之后它会匹配每个符号,不管它是什么,包括下一个双引号的拳头发生,它会继续直到第一个新行。 *表达式因为贪婪而起作用(检查贪婪vs懒惰正则表达式)。 所以我假设你只有修改

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

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