.net 如何将双引号中的字符串与转义匹配?

.net 如何将双引号中的字符串与转义匹配?,.net,json,regex,string,.net,Json,Regex,String,我很确定,我不能用正则表达式来做这件事,但也许你们中有人更了解它。 这是我目前的模式: ^\[\s*"[^\n]+?(?<!\\)"(?:,\s*"[^\n]+?(?<!\\)")*\s*\] 而且 ["1"", "2"] 我知道原因: [^\n]+?有一个尾随的非贪婪符号,但它捕捉到未替换的结束双引号以匹配“[^\n]+?(?这可能就可以了 (?s)^\[\s*“[^”\]*(?:\\.[^”\]*)*”(?:\s*,\s*“[^”\]*(?:\.\.^“\]*)*”*“*”\

我很确定,我不能用正则表达式来做这件事,但也许你们中有人更了解它。
这是我目前的模式:

^\[\s*"[^\n]+?(?<!\\)"(?:,\s*"[^\n]+?(?<!\\)")*\s*\]
而且

["1"", "2"]
我知道原因:

[^\n]+?
有一个尾随的非贪婪符号,但它捕捉到未替换的结束双引号以匹配
“[^\n]+?(?这可能就可以了

(?s)^\[\s*“[^”\]*(?:\\.[^”\]*)*”(?:\s*,\s*“[^”\]*(?:\.\.^“\]*)*”*“*”\s*”


一周前,我为我的问题编写了一个json解析器,所以这实际上只是一个正则表达式问题……顺便说一句/仅供参考:我尝试了PowerShell的newtonsoft.json模块作为json反序列化器,50%的错误消息都是无用的,并且没有位置信息,因此我编写了自己的,始终包含详细的错误消息和正确的错误行号。仅供参考json。NET是最流行的Json解析器,用于ASP.NET Core和ASP.NET Web API。是的,如果行正确,行号是正确的。如果只有一行,或者每行只有一个Json片段,则可能很难找到错误。如果您有解析问题,请询问它们。不要假设最流行的NuGet包已损坏@PanagiotisKanavos您已经表明了您的观点,显然OP需要一个正则表达式解决方案,您所能做的就是给出您的建议并继续前进。非常简单,谢谢。我刚刚添加了2x
(?!”
,因为我不想在这里允许空字符串。所以我将使用的最后一个正则表达式是:
(?s)^\[\s*(?!”[^\]*(?:\\..\.-.[^\]*)*(?::\*,\s*,\s*(?:“(?!”)[^“\\]*)*”*”*“\s*”*”
我不得不稍微纠正一下这个模式,因为它允许在字符串中间换行,这在json中是无效的。现在最后的模式是:
^\[\s*”(?!”[^\\\n]*(?:\[^\n][^\\\n]*”(?:\s*,\s*(?!”[^\\\n]*(?:\[^\\\\\\\\\\n]*)*)*(?:\\[^\\\\\\\\\\\n]*)*)*”*。
["1"", "2"]
 (?s)                          # Dot-all modifier
 ^                             # BOS
 \[                            # Open [
 \s*                           # optional wsp

 "                             # Open dbl quote
 [^"\\]*                       # optional not dbl quote nor escape
 (?: \\ . [^"\\]* )*           # optional escape anything, not dlb quote nor escape
 "                             # Close dbl quote

 (?:                           # Cluster
      \s* ,  \s*                    # opt wsp, comma, opt wsp
      "                             # Same as above
      [^"\\]*                        
      (?: \\ . [^"\\]* )*
      "                             
 )*                            # End cluster, do 0 to many times
 \s*                           # optional wsp
 \]                            # Close ]