【问题标题】:RegEx with escaped double quotes带有转义双引号的正则表达式
【发布时间】:2018-09-05 22:17:05
【问题描述】:

我有以下主要适用于我的用例的 RegEx(CLI 命令解释器):

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

它匹配以下场景(并成功分离零件):

foo list
foo list --barId ae920cf4-79e7-4c6f-8420-2d64cd6e4ae2
foo list --name "foo's name"
foo create --description "this is a \"description\" with some escaped quotes"

缺少的部分是我已经转义了未被外部未转义双引号包裹的双引号。示例:

bar create --expression service.GetData(\"2194c75c-26be-405a-b264-5a96152d93f8\")

这里,整个“service.GetData”语句应该是一个匹配项,但它在(转义的)双引号处中断。如果我将参数值用双引号括起来,它就可以工作(就像在前面的示例块中一样)。不幸的是,当参数值没有用双引号括起来时,我也需要它。

有人可以帮忙做最后一个吗?

【问题讨论】:

  • 你有两次相同的开始模式:[^\s"]+|[^\s"]+
  • 复制/粘贴问题,已修复。
  • 这看起来像一个 Perl 正则表达式。这是在 Perl 中使用的吗?使用真正的分词器,例如 Text::Parse 的 shellwords() 函数。它将处理“单引号”和反引号以及things" with inline double "quotes
  • 不,不是 Perl。 RegEx 在 ASP.NET Core API 中执行。
  • ASP.NET Core API 肯定具有解析命令行选项的功能,不是吗?毫无疑问,无论您使用哪种语言,这都是一个已解决的问题。

标签: regex


【解决方案1】:

你可以使用单引号吗?好像是这样,那么您可以将您的报价捕获部分放在第一位,以便它贪婪地匹配。

(?:"|')[^"\\]*(?:\\.[^"\\]*)*(?:"|')|[^\s"]+

这将匹配以下内容:

bar create --expression 'service.GetData(\"2194c75c-26be-405a-b264-5a96152d93f8\")'

否则,您会遇到如何区分部分的问题。除非您可以对间距做出进一步的限制。如果您能够说您不能在未用引号括起来的参数中传递空格,那么您可以这样做:

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

【讨论】:

    【解决方案2】:

    我最终只是用 CLI 客户端应用程序中的双引号将所有参数值包装起来。这使得原来的 RegEx 工作得很好。

    【讨论】:

      猜你喜欢
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多