C# 正则表达式匹配json节点

C# 正则表达式匹配json节点,c#,.net,regex,json,C#,.net,Regex,Json,我需要在长JSON字符串中提取特定节点内的一个节点值 i、 e.人员节点的描述节点: “人”:{“年龄”:“10”,“描述”:“示例”,工作:{“职称”:“销售”,“工资”:“$3000”},“性别”:“男性”} 由于使用JSON库反序列化一个长JSON字符串浪费了太多时间,我在谷歌上搜索并找到了一个正则表达式来匹配一个JSON节点值,它在大多数情况下工作得很快(需要几毫秒) Regex Regex=new Regex(“\”person\”:{(?:[^{}]}(?{)\\(?}))*\“de

我需要在长JSON字符串中提取特定节点内的一个节点值

i、 e.人员节点的描述节点:

”:{“年龄”:“10”,“描述”:“示例”,工作:{“职称”:“销售”,“工资”:“$3000”},“性别”:“男性”}

由于使用JSON库反序列化一个长JSON字符串浪费了太多时间,我在谷歌上搜索并找到了一个正则表达式来匹配一个JSON节点值,它在大多数情况下工作得很快(需要几毫秒)

Regex Regex=new Regex(“\”person\”:{(?:[^{}]}(?{)\\(?}))*\“description\”:\“(.*?)\”(?:.*?((open)(?!))});
由于未知原因发生匹配后,如果某个内部节点中存在重复的节点名,则其工作缓慢(使用整整一秒钟):

“人”:{“年龄”:“10”,“描述”:“示例”,工作:{“职称”:“销售”,“工资”:“$3000”,“描述”:“示例”},“性别”:“男性”}

我希望提高此正则表达式的效率,以便它只检查person节点(粗体)的最外层内容:

“人”:{“年龄”:“10”,“描述”:“示例”,工作:{“职称”:“销售”,“工资”:“$3000”,“描述”:“示例”},“性别”:“男性”}

我是新来的正则表达式,这个正则表达式可能不适合我的情况。

有什么想法吗?

这个正则表达式应该适合您的情况,而且应该更快:

“人”\s*:\s*\{(?:
((?(打开)(?!)|(?>“说明”\s*:\s*”(?(?:\\.\124;(?>[^\\”]+)*))
|(?>[^{}"]+)
|(?>(?:"(?:\\.|(?>[^\\"]+))*"))
|(?\{)
|(?\})
)*?
(?(开放)(?!))
(?(说明)|(?!)

将其与
IgnorePatternWhitespace
一起使用。它也将正确处理转义引号(
\“
)。您的说明将位于
说明
命名组中

它应该更快,因为我在一些我知道回溯没有用的地方使用了原子组(
(?>…)
),并且我让它在找到想要的描述后立即停止扫描文本

哦,你应该对正则表达式使用逐字字符串,这样你就不必逃避一切:

var regex = new Regex(@".....")

解析JSON并提取所需的值应该更容易(而且可能更快)。请参考描述中包含诸如
“description”之类的引号时出现的情况:“example\“blah\”
要提取什么?@wdosanjos我使用JSON.NET使用JObject.parse(JSON)解析相当短的JSON并且已经使用了大约60毫秒。@M42您是对的。幸运的是,在我的情况下,该值永远不会包含“
作业
叶后面的\”使这个问题变得简单这不会捕获属性“,在OP的示例中为“sex”:“男性”"@funkurm在我的理解中,询问者只需要
描述
节点,所以我的正则表达式一捕获它就停止了。是的,我只需要一个节点。与我使用的正则表达式相比,这个正则表达式在任何情况下都运行得非常好,速度更快!我希望我能像你一样构建这种复杂但高效的正则表达式。谢谢太多了!@IsoletChan不客气。如果你想掌握正则表达式,请看,特别是关于Jeffrey Friedl的书的建议。我一定会买这本书的!:)
var regex = new Regex(@".....")