正则表达式匹配json节点

时间:2014-10-03 12:13:15

标签: c# .net regex json

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

即。人员节点的描述节点:

  

" ":{"年龄":" 10"," 说明":"例如"伯:{"标题":"销售""工资":" $ 3000 "},"性别":"男性"}

由于使用JSON库来反序列化浪费了太多时间的长JSON字符串,我用Google搜索并找到了一个匹配一个JSON节点值的正则表达式,并且它在大多数情况下都能快速运行(需要几毫秒)

Regex regex = new Regex("\"person\":{(?:[^{}]|(?<open>{)|(?<-open>}))*\"description\":\"(.*?)\"(?:.*?)(?(open)(?!))}");

在匹配发生后,由于未知原因,在某个内部节点中存在重复的节点名称时,它运行缓慢(使用一整秒):

  

&#34; person&#34;:{&#34; age&#34;:&#34; 10&#34;,&#34; description &#34;:&# 34;例子&#34;,工作:{&#34;标题&#34;:&#34;销售&#34;,&#34;工资&#34;:&#34; $ 3000&#34;,&#34 ; 描述&#34;:&#34;示例&#34;},&#34;性别&#34;:&#34;男性&#34;}

我想提高这种正则表达式效率,以便它只检查人员节点的最外层内容(粗体):

  

&#34; person&#34;:{&#34;年龄&#34;:&#34; 10&#34;,&#34;说明&#34;:&#34;示例&#34 ; ,工作:{&#34; title&#34;:&#34; sales&#34;,&#34; salary&#34;:&#34; $ 3000&#34;,&#34;说明&#34;:&#34;示例&#34;},&#34;性别&#34;:&#34;男性&#34; }

我是正则表达式的新手,这个正则表达式可能不适合我的情况 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

此正则表达式适用于您的情况,而更快:

"person"\s*:\s*\{(?:
  (?(open)(?!)|(?>"description"\s*:\s*"(?<description>(?:\\.|(?>[^\\"]+))*)"))
  |(?>[^{}"]+)
  |(?>(?:"(?:\\.|(?>[^\\"]+))*"))
  |(?<open>\{)
  |(?<-open>\})
)*?
(?(open)(?!))
(?(description)|(?!))

DEMO

IgnorePatternWhitespace一起使用。它也将正确处理转义引号(\")。您的描述将在description命名组中。

它应该更快,因为我在一些我知道回溯无用的地方使用原子组((?>...)),而且我还在找到所需的描述后立即停止扫描文本。 / p>

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

var regex = new Regex(@".....")
相关问题