【问题标题】:How to match a string in double quotes with escaping?如何将双引号中的字符串与转义匹配?
【发布时间】:2018-12-21 23:27:01
【问题描述】:

我很确定,我不能用正则表达式来做到这一点,但也许你们中的一个人更了解它。
到目前为止,这是我的模式:

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

(它在 .NET 语法中,(?:) 是一个非捕获组,
(?&lt;!) 一个消极的组)

这是一个 json 字符串数组,所以我必须在这里处理转义的双引号。 (?&lt;!\\)"
我的问题是,我的模式匹配这些示例字符串:

["", ""]

还有

["1"", "2"]

我知道为什么:
[^\n]+? 有一个尾随非贪婪符号,但它捕获未转义的右双引号以匹配第一个示例中的 "[^\n]+?(?&lt;!\\)" 和第二个示例字符串中的另一组 ,\s*"[^\n]+?(?&lt;!\\)"

我需要的是一个正则表达式,它总是在第一个关闭的非转义双引号处停止,无论接下来会发生什么。

所以我认为正则表达式太模棱两可了。

【问题讨论】:

  • 一周前我为我的问题写了一个 json 解析器,所以这实际上只是一个正则表达式问题......
  • 顺便说一句/仅供参考:我已经尝试将 PowerShell 的 newtonsoft.json 模块作为 json 反序列化器,并且 50% 的错误消息是无用的并且没有位置信息,所以我自己编写了一个总是详细的错误消息和正确的错误行号。
  • 仅供参考 Json.NET 是最流行的 Json 解析器,用于 ASP.NET Core 和 ASP.NET Web API。是的,如果 lines 正确,则行号是正确的。如果只有一行,或者每行有一个 JSON 片段,则可能更难找到问题所在。如果您有解析问题,请询问它们。不要假设最流行的 NuGet 包已损坏
  • @PanagiotisKanavos 你已经表达了你的观点,显然 OP 想要一个正则表达式解决方案,你所能做的就是给出你的建议并继续前进。

标签: .net json regex string


【解决方案1】:

这可能会做到这一点

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

https://regex101.com/r/mT66Nd/1

 (?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 ]

【讨论】:

  • 太好了,太简单了,谢谢。我刚刚添加了 2x (?!"),因为我不想在这里允许空字符串。所以我将使用的最后一个正则表达式是:(?s)^\[\s*"(?!")[^"\\]*(?:\\.[^"\\]*)*"(?:\s*,\s*"(?!")[^"\\]*(?:\\.[^"\\]*)*")*\s*\]
  • 我不得不稍微纠正这个模式,因为它允许中间字符串中的换行符,这在 json 中是无效的。现在的最终模式是:^\[\s*"(?!")[^"\\\n]*(?:\\[^\n][^"\\\n]*)*"(?:\s*,\s*"(?!")[^"\\\n]*(?:\\[^\n][^"\\\n]*)*")*\s*\]
猜你喜欢
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2015-10-27
  • 2017-01-26
  • 2013-01-06
相关资源
最近更新 更多