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时,替换似乎就好像选择了“单线”选项一样有效。下面是我使用的代码
{
"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\": ([\"]).*?([\"])"