LINQ或REGEX从字符串中提取某些文本

时间:2013-11-05 11:27:51

标签: c# regex linq

我的C#模型中有一个字符串,上面填充了这个字符串:

“[{\” TA_ID \ “:97497,\” PARTNER_ID \ “:\” 229547 \” \ “partner_url \”:\ “http://partner.com/deeplink/to/229547 \”},{\ “TA_ID \”: 97832,\ “PARTNER_ID \”:\ “id34234 \”,\ “partner_url \”:\ “http://partner.com/deeplink/to/id34234 \”}]“

有没有办法,使用LINQ或RegEx,我可以解析出partner_id的 - 所以我最终得到了一个列表对象:

229547
id34234

感谢您的帮助,Mark

4 个答案:

答案 0 :(得分:2)

假设您的链接始终具有合作伙伴ID -

   string Name = "[{\"ta_id\":97497,\"partner_id\":\"229547\",\"partner_url\":\"http://partner.com/deeplink/to/229547\"},{\"ta_id\":97832,\"partner_id\":\"id34234\",\"partner_url\":\"http://partner.com/deeplink/to/id34234\"}]";

        string[] splittedString = Regex.Split(Name, "}");
        List<string> allIds = new List<string>();
        foreach (var i in splittedString)
        { 
            var ids =Regex.Split(i, "/");
            string id = ids[ids.Length - 1];
            allIds.Add(id);
        }

答案 1 :(得分:2)

我从未使用任何JSON解析器,但如果涉及Regex,你可以尝试这样的事情:

private static void regexString()
{
    string myString = "[{\"ta_id\":97497,\"partner_id\":\"229547\",\"partner_url\":\"http://partner.com/deeplink/to/229547\"},{\"ta_id\":97832,\"partner_id\":\"id34234\",\"partner_url\":\"http://partner.com/deeplink/to/id34234\"}]";

    string[] stringList = Regex.Split(myString, "},{");

    for (int i=0; i<stringList.Length ;i++)
    {
        stringList[i] = Regex.Split(Regex.Split(stringList[i], "partner_id\\\":\\\"")[1], "\\\",\\\"partner_url\\\"")[0];
    }
}

此外,有一个很好的网站可以帮助您将来创建自己的正则表达式模式,请查看:

gskinner.com

一个很好的简短教程:

www.codeproject.com

答案 2 :(得分:2)

如果这是字符串的一般格式,则此正则表达式应该起作用

(?i)(?<=(partner_id).{5})\w+

测试here

这将从您的字符串中获取

229547 and id34234

(?i) =案例无效

对于parter_id,

(?<=(partner_id).{5}) = postive lookbehind ,然后在这种情况下为\":\"

的任意5个字符

\w+ =一次或多次任何字母数字字符

希望这有帮助

答案 3 :(得分:0)

由于这是JSON,您可能不应该费心去尝试使用正则表达式。相反,您可以解析JSON然后使用LINQ。

using System.Web.Script.Serialization; // (in System.Web.Extensions.dll)

...

string s = "[{\"ta_id\":97497,\"partner_id\":\"229547\",\"partner_url\":\"http://partner.com/deeplink/to/229547\"},{\"ta_id\":97832,\"partner_id\":\"id34234\",\"partner_url\":\"http://partner.com/deeplink/to/id34234\"}]";
JavaScriptSerializer j = new JavaScriptSerializer();
object[] objects = (object[])j.DeserializeObject(s);
string[] ids = objects.Cast<Dictionary<string, object>>()
                      .Select(dict => (string)dict["partner_id"])
                      .ToArray();

将它反序列化为对象有点麻烦,因为你没有任何类型信息。如果你不想让一个小班去反序列化,你可以这样做:

class Foo
{
    public string partner_id
    {
        get;
        set;
    }
}

...

JavaScriptSerializer j = new JavaScriptSerializer();
string[] ids = j.Deserialize<Foo[]>(s).Select(x => x.partner_id).ToArray();

请注意,还有其他用于反序列化JSON的选项。我只选择了内置的最通用的。