正则表达式组替换

时间:2013-10-17 13:18:32

标签: c# regex json

我正在研究正则表达式,我无法弄清问题是什么。我已经尝试了几个帮助网站,如http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashxhttp://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之后查看结果时,没有任何内容被替换。有谁看到我在这里做错了什么?

3 个答案:

答案 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"不在字符串中,所以没有匹配。