我需要在长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; }
我是正则表达式的新手,这个正则表达式可能不适合我的情况 有什么想法吗?
答案 0 :(得分:1)
此正则表达式适用于您的情况,而应更快:
"person"\s*:\s*\{(?:
(?(open)(?!)|(?>"description"\s*:\s*"(?<description>(?:\\.|(?>[^\\"]+))*)"))
|(?>[^{}"]+)
|(?>(?:"(?:\\.|(?>[^\\"]+))*"))
|(?<open>\{)
|(?<-open>\})
)*?
(?(open)(?!))
(?(description)|(?!))
与IgnorePatternWhitespace
一起使用。它也将正确处理转义引号(\"
)。您的描述将在description
命名组中。
它应该更快,因为我在一些我知道回溯无用的地方使用原子组((?>...)
),而且我还在找到所需的描述后立即停止扫描文本。 / p>
哦,你应该为正则表达式使用逐字字符串,这样你就不必逃避一切:
var regex = new Regex(@".....")