我正在研究正则表达式,我无法弄清问题是什么。我已经尝试了几个帮助网站,如http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx和http://gskinner.com/RegExr/但不知何故,当我将测试的正则表达式放在c#中时,它未正确处理
我正在处理我可以从JIRA收到的JSON字符串。这个JSON字符串的严重剥离和美化版本如下:
{
"fields": {
"progress": {
"progress": 0,
"total": 0
},
"summary": "Webhook listener is working",
"timetracking": {},
"resolution": null,
"resolutiondate": null,
"timespent": null,
"reporter": {
"self": "http://removed.com/rest/api/2/user?username=removed",
"name": "removed@nothere.com",
"emailAddress": "removed@nothere.com",
"avatarUrls": {
"16x16": "http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=16",
"24x24": "http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=24",
"32x32": "http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=32",
"48x48": "http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=48"
},
"displayName": "Wubinator]",
"active": true
},
"updated": "2013-08-20T14:08:00.247+0200",
"created": "2013-07-30T14:41:07.090+0200",
"description": "Say what?",
"customfield_10001": null,
"duedate": null,
"issuelinks": [],
"customfield_10004": "73",
"worklog": {
"startAt": 0,
"maxResults": 0,
"total": 0,
"worklogs": []
},
"project": {
"self": "http://removed.com/rest/api/2/project/EP",
"id": "10000",
"key": "EP",
"name": "EuroPort+ Suite",
"avatarUrls": {
"16x16": "http://removed.com/secure/projectavatar?size=xsmall&pid=10000&avatarId=10208",
"24x24": "http://removed.com/secure/projectavatar?size=small&pid=10000&avatarId=10208",
"32x32": "http://removed.com/secure/projectavatar?size=medium&pid=10000&avatarId=10208",
"48x48": "http://removed.com/secure/projectavatar?pid=10000&avatarId=10208"
}
},
"customfield_10700": null,
"timeestimate": null,
"lastViewed": null,
"timeoriginalestimate": null,
"customfield_10802": null
}
}
我需要将这个JSON转换为XML当然这不是直接可能的,因为json中的“16x16”,“24x24”,“32x32”和“48x48”位将被转换为< 16x16 / >,< 24x24 /&gt ;,< 32x32 />和< 48x48 />标签是无效标签。
XML的接收者甚至不需要那些头像网址所以我在考虑剥离整个“avatarUrls”:“{.....},在将json移交给JSON.NET进行转换之前
我正在考虑使用正则表达式来做这件事。在对上述网站进行一些测试后,我得到了以下正则表达式:
( “avatarUrls)(。*?)(” 显示名“)
Regex.Replace方法应该删除所有找到的结果而不是第三个groep(a.k.a。“displayName”)
网站http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx向我展示了正确的群组并找到了结果,并说所提到的正则表达式应该在C#中使用:
@ “(” “avatarUrls)(。*?)(” “显示名” “)”
所以在C#中我写了以下内容:
string expression = @"(""avatarUrls)(.*?)(""displayName"")";
string result = Regex.Replace(json, expression, "$3");
return result;
当我在RegexReplace之后查看结果时,没有任何内容被替换。有谁看到我在这里做错了什么?
答案 0 :(得分:1)
我不会使用正则表达式来删除这些节点。我会改用JSON .Net来删除你不想要的节点。
我指的是quote:
有些人在遇到问题时会想“我知道,我会用 正则表达式。“现在他们有两个问题。
使用找到的答案here,您可以写:
var jsonObject = (JObject)JsonConvert.DeserializeObject(yourJsonString);
removeFields(jsonObject.Root, new[]{"avatarUrls"});
(请注意,我不确定您是否要同时删除“avatarUrls”节点。)
答案 1 :(得分:0)
Regex.Replace
超载需要RegexOptions,您可能需要查看。例如,要使.
匹配每个字符(而不是除\ n之外的每个字符),您需要指定RegexOptions.Singleline
。此外,您似乎正在尝试将@"(""avatarUrls)(.*?)(""displayName"")"
的所有匹配替换为$3
吗?你最好做这样的事情:
var match = Regex.Match(json, pattern, options);
while (match.Success) {
// Do stuff with match.Groups(1)
match = match.NextMatch();
}
然而......我不确定是否会在源字符串中替换它。
答案 2 :(得分:0)
问题完全不同:
在以下字符串中:
{"16x16":"http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=16, "32.32"
有一个'&'启动表示下一个参数的魔术符号。因此,没有读取完整的JSON,因此无法正确转换它。它还表明为什么在我使用的正则表达式中没有被替换,因为" displayName"不在字符串中,所以没有匹配。