【问题标题】:Golang regex to extract values inside parantheses and ignore inner parantheses in any [duplicate]Golang正则表达式提取括号内的值并忽略任何[重复]中的内括号
【发布时间】:2020-04-06 23:13:18
【问题描述】:

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

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 正则表达式。

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

我将不胜感激。

【问题讨论】:

  • strings.Split(x, " and ")
  • 对于给定的示例,您的解决方案有效,但我可能不适用于 start=("a", "b and a") 之类的值。
  • 不要为此使用正则表达式。写一个解析器,超级简单。
  • 一个快速的unrolled 想法:\w+=\([^)(]*(?:\([^)(]*\)[^)(]*)*\) 但是如果涉及到任意嵌套括号并且没有可用的正则表达式递归,解析器是唯一的解决方案。如果是关于转义的引用,你也可以试试\w+=\(".*?[^\\]"\)

标签: regex go re2


【解决方案1】:

问题是转义引号:

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

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

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

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

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

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

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


更新:

@Wiktor Stribiżew评论了below

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

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

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

【讨论】:

  • 但它不会匹配between=("range(2019, max, to=\"le\")", "b"),请参阅regex101.com/r/3ytO9P/2\S+=(\([^(]*(?:[^("]*"(?:[^\\"]|\\["\\])*")(\))) 是错误的模式。
  • @WiktorStribiżew 谢谢。我在原始正则表达式中没有看到这一点。已更新。
  • 感谢@Anonymous 完美工作:)
  • 它仍然不支持其他转义序列。第一个[^("]* 在当前模式中是多余的。它不会匹配 between=("a",,,) 但会匹配 between=("a",,",") - 这是不一致的。正确的正则表达式将匹配用逗号分隔的有效双引号字符串文字以及它们之间的任意数量的空格。 \S+=(\([^(]*(?:[^("]*"(?:[^\\"]|\\["\\])*")(\))) 不是正确的模式恕我直言
  • @WiktorStribiżew 您肯定可以进行其他更改。虽然从问题中不清楚这些是 OP 想要的,但最好指出它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多