C# Regex向前看还是向后看

C# Regex向前看还是向后看,c#,regex,C#,Regex,我正在学习如何使用regex lookahead和lookahead 我想从这样的文本中提取json值 {"html":"\n\t\t\t\t<table class=\"table\">"} Regex.Match(text, "\"html\":\"([^(?<!\\\\)\"]*)").Groups[1].Value 我在C上使用正则表达式,就像这样 {"html":"\n\t\t\t\t<table class=\"table\">"} Reg

我正在学习如何使用regex lookahead和lookahead

我想从这样的文本中提取json值

{"html":"\n\t\t\t\t<table class=\"table\">"} 
 Regex.Match(text, "\"html\":\"([^(?<!\\\\)\"]*)").Groups[1].Value
我在C上使用正则表达式,就像这样

{"html":"\n\t\t\t\t<table class=\"table\">"} 
 Regex.Match(text, "\"html\":\"([^(?<!\\\\)\"]*)").Groups[1].Value


但它根本不起作用。我可以用C正则表达式得到这个值吗?

有一个非常适合您的方法,这正是您在解析JSON对象时所需要的

好的,如果您正在学习正则表达式,下面是您检索JSON数据的示例:

class Program
{
    static void Main(string[] args)
    {
        // {"html":"\n\t\t\t\t<table class=\"table\">"} 
        var s = "{\"html\":\"\n\t\t\t\t<table class=\\\"table\\\">\"}";
        Console.WriteLine("\"{0}\"", ParseJson("html", s).First());
        // You might wanna do Trim() on the string because of those \t\t\t etc.
    }
    static private IEnumerable<string> ParseJson(string key, string input)
    {
        Regex r = new Regex(@"\{\""" + key + "\""\:\""(.*?)(?<!\\)\""\}", RegexOptions.Singleline);
        return r.Matches(input).Cast<Match>().Select(T => T.Groups[1].Value);
    }
}
请注意:

使用作为双引号的反向查找,前面没有反斜杠。 使用RegexOptions.Singleline作为点。匹配换行符的字符\r&\n。 :
这里有一个非常适合您的方法,这正是您在解析JSON对象时所需要的

好的,如果您正在学习正则表达式,下面是您检索JSON数据的示例:

class Program
{
    static void Main(string[] args)
    {
        // {"html":"\n\t\t\t\t<table class=\"table\">"} 
        var s = "{\"html\":\"\n\t\t\t\t<table class=\\\"table\\\">\"}";
        Console.WriteLine("\"{0}\"", ParseJson("html", s).First());
        // You might wanna do Trim() on the string because of those \t\t\t etc.
    }
    static private IEnumerable<string> ParseJson(string key, string input)
    {
        Regex r = new Regex(@"\{\""" + key + "\""\:\""(.*?)(?<!\\)\""\}", RegexOptions.Singleline);
        return r.Matches(input).Cast<Match>().Select(T => T.Groups[1].Value);
    }
}
请注意:

使用作为双引号的反向查找,前面没有反斜杠。 使用RegexOptions.Singleline作为点。匹配换行符的字符\r&\n。 : 对于这种情况,应该是足够好的近似值

我用标准的regexp方式编写了它;记住对C字符串文本转义反斜杠和引号

对于这种情况,应该是足够好的近似值


我用标准的regexp方式编写了它;请记住为C字符串文本转义反斜杠和引号。

为什么不使用JavaScriptSerializer?为什么是regexp?@Amadan因为我正在学习Regex lookahead和lookbehind。lookahead和lookbehind被称为零长度断言。这意味着它们返回是否找到匹配项,但不返回匹配项@完全正确!我想确保[^]*不是以\character结尾为什么不使用JavaScriptSerializer?为什么是regexp?@Amadan因为我正在学习Regex lookahead和lookbehind。lookahead和lookbehind被称为零长度断言。这意味着它们返回是否找到匹配项,但不返回匹配项@完全正确!我想确保[^]*不是以\character结尾。他试图学习正则表达式,但不一定要解析JSON。他试图学习正则表达式,但不一定要解析JSON。实际上,我的JSON值很大。这个代码在那里不起作用。我刚刚在这里发布了json的开头。正如我所说,它适用于本例。我可以想象,如果在未转义的引号之前有一个转义反斜杠,或者非字符串值,或者键不是html的值,那么它就不起作用了。这就是为什么对于真实数据,您使用的解析器比常规自动机具有更多的状态,最好是已经编写和测试过的东西,比如JavaScriptSerializer。或者至少使用一种带有强大正则表达式的语言,比如,它实现了递归,因此不再是常规的。实际上我的json值非常大。这个代码在那里不起作用。我刚刚在这里发布了json的开头。正如我所说,它适用于本例。我可以想象,如果在未转义的引号之前有一个转义反斜杠,或者非字符串值,或者键不是html的值,那么它就不起作用了。这就是为什么对于真实数据,您使用的解析器比常规自动机具有更多的状态,最好是已经编写和测试过的东西,比如JavaScriptSerializer。或者至少使用一种具有强大正则表达式的语言,比如实现递归的正则表达式,因此不再是正则表达式。