Golang 正则表达式提取括号内的值并忽略任何内括号

M.H*_*ini 5 regex go re2

我有以下键=值对示例作为一行字符串

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

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

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

stackoverflow 上有解决方案,但不适用于 golang regex。

有一个链接指向我使用 golang regex 的失败尝试:regex101 golang flavor

我将不胜感激任何帮助。

Ano*_*ous 3

问题是转义引号:

\n\n
\\S+=(\\([^(]*(?:[^("]*"(?:[^\\\\"]|\\\\["\\\\])*")(\\)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

不过你的正则表达式还有其他问题。这应该效果更好:

\n\n
\\S+=(\\([^("]*(?:[^("]*"(?:[^\\\\"]|\\\\["\\\\])*")*(\\)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

它会更改[^(][^("]以防止"匹配,除非它\xe2\x80\x99s 是完整字​​符串的一部分。

\n\n
\n\n

更新:

\n\n

@Wiktor Stribi\xc5\xbcew评论如下

\n\n
\n

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

\n
\n\n

如果您确实希望正则表达式如此强大,您应该使用解析器,但您可以通过使用以下方法来解决这些问题:

\n\n
\\S+=(\\((?:[^("]*"(?:[^\\\\"]|\\\\.)*"[^("]*)*(\\)))\n
Run Code Online (Sandbox Code Playgroud)\n

  • @WiktorStribiżew 您肯定还可以进行其他更改。从问题中尚不清楚这些是OP想要的,但指出它们是很好的 (2认同)