首页 > 解决方案 > Golang正则表达式提取括号内的值并忽略任何内部括号

问题描述

我有以下key=value对的示例作为一个行字符串

start=("a", "b") and between=("range(2019, max, to=\"le\")") and end=("a", "b")

在golang中使用正则表达式我想提取键=值对,如下所示

  1. start=("a", "b")
  2. between=("range(2019, max, to=\"le\")")
  3. end=("a", "b")

stackoverflow 上有解决方案,但不适用于 golang 正则表达式。

有一个链接指向我使用 golang 正则表达式的失败尝试:regex101 golang flavor

我将不胜感激任何帮助。

标签: regexgore2

解决方案


问题是转义的引号:

\S+=(\([^(]*(?:[^("]*"(?:[^\\"]|\\["\\])*")(\)))

https://regex101.com/r/3ytO9P/1

[^"]改为(?:[^\\"]|\\["\\]). 这使得正则表达式查找常规字符或转义字符。通过匹配转义,它不允许\"结束匹配。

不过,您的正则表达式还有其他问题。这应该会更好:

\S+=(\([^("]*(?:[^("]*"(?:[^\\"]|\\["\\])*")*(\)))

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

它更改[^(][^("]以防止"被匹配,除非它是完整字符串的一部分。


更新:

@Wiktor Stribiżew在下面评论:

它仍然不支持其他转义序列。第一个[^("]*在当前模式中是多余的。它不会匹配between=("a",,,)但会匹配between=("a",,",")- 这是不一致的。正确的正则表达式将匹配用逗号分隔的有效双引号字符串文字以及它们之间的任意数量的空格。恕我直言,这\S+=(\([^(]*(?:[^("]*"(?:[^\\"]|\\["\\])*")(\)))不是正确的模式

如果您真的希望正则表达式如此健壮,您应该使用解析器,但您可以使用以下方法解决这些问题:

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

推荐阅读