为了账号安全,请及时绑定邮箱和手机立即绑定

Golang正则表达式提取括号内的值并忽略任何[重复]中的内部括号

Golang正则表达式提取括号内的值并忽略任何[重复]中的内部括号

Go
拉莫斯之舞 2022-04-26 10:39:11
我有以下key=value对的示例作为一个行字符串start=("a", "b") and between=("range(2019, max, to=\"le\")") and end=("a", "b")在golang中使用正则表达式我想提取键=值对,如下所示start=("a", "b")between=("range(2019, max, to=\"le\")")end=("a", "b")stackoverflow 上有解决方案,但不适用于 golang 正则表达式。有一个链接指向我使用 golang 正则表达式的失败尝试:regex101 golang flavor我将不胜感激任何帮助。
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

问题是转义的引号:

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

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

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

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

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

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

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


更新:

@Wiktor Stribiżew在下面评论:

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

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

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


查看完整回答
反对 回复 2022-04-26
  • 1 回答
  • 0 关注
  • 509 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信