regex - Golang正则表达式提取括号内的值并忽略任何内部括号
问题描述
我有以下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
我将不胜感激任何帮助。
解决方案
问题是转义的引号:
\S+=(\([^(]*(?:[^("]*"(?:[^\\"]|\\["\\])*")(\)))
https://regex101.com/r/3ytO9P/1
我[^"]
改为(?:[^\\"]|\\["\\])
. 这使得正则表达式查找常规字符或转义字符。通过匹配转义,它不允许\"
结束匹配。
不过,您的正则表达式还有其他问题。这应该会更好:
\S+=(\([^("]*(?:[^("]*"(?:[^\\"]|\\["\\])*")*(\)))
https://regex101.com/r/OuDvyX/1
它更改[^(]
为[^("]
以防止"
被匹配,除非它是完整字符串的一部分。
更新:
它仍然不支持其他转义序列。第一个
[^("]*
在当前模式中是多余的。它不会匹配between=("a",,,)
但会匹配between=("a",,",")
- 这是不一致的。正确的正则表达式将匹配用逗号分隔的有效双引号字符串文字以及它们之间的任意数量的空格。恕我直言,这\S+=(\([^(]*(?:[^("]*"(?:[^\\"]|\\["\\])*")(\)))
不是正确的模式
如果您真的希望正则表达式如此健壮,您应该使用解析器,但您可以使用以下方法解决这些问题:
\S+=(\((?:[^("]*"(?:[^\\"]|\\.)*"[^("]*)*(\)))
推荐阅读
- sql - 根据更改的列 SQL 过滤结果集
- java - 如何在方法中接受像 {1,2,3,45} 这样的输入作为数组?
- xlsxwriter - 在 xlsxwriter 单元格中对齐图像
- python - Django 过滤查询集 __in=list for *every* item in queryset
- spring-boot - 我可以使用camel-spring 2.25.x 版和camel-core 2.23.x 版吗
- python - StackingRegressor (Sklearn) 的预测是不可重现的
- c# - EF Core:获取子列表中存在属性的数据库记录
- google-ads-api - isMCCaccount() 的广告脚本方法?
- c# - 使用 Newtonsoft.Json 将字符串转换为对象列表
- javascript - 如何使用 JavaScript 数组为 HTML 中的表格仅选择几个项目