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

Golang regex to extract values inside parantheses and ignore inner parantheses in any

我有以下 key=value 对作为一行 string

的示例

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")

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

我对 golang 正则表达式的失败尝试有一个 link:regex101 golang flavor

如有任何帮助,我将不胜感激。

问题是转义引号:

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

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

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

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

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

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

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


更新:

@Wiktor Stribiżew commented :

It still does not support other escape sequences. The first [^("]* is redundant in the current pattern. It won't match between=("a",,,) but will match between=("a",,",") - this is inconsistent. The right regex will match valid double quoted string literals separated with commas and any amount of whitespace between them. The \S+=(\([^(]*(?:[^("]*"(?:[^\"]|\["\])*")(\))) is not the right pattern IMHO

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

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