登录
首页 >  Golang >  Go问答

提取括号内的值,忽略内部嵌套的括号

来源:stackoverflow

时间:2024-03-02 19:00:27 317浏览 收藏

从现在开始,努力学习吧!本文《提取括号内的值,忽略内部嵌套的括号》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

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

开始=(“a”,“b”)和之间=(“范围(2019,最大值,到=\”le\“)”)和结束=(“a”,“b”)

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

  1. start=("a", "b")
  2. Between=("范围(2019年,最大值,至=\"le\")")
  3. end=("a", "b")

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

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

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


解决方案


问题是转义引号:

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

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

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

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

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

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

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

更新:

@Wiktor Stribiżew评论below

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

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

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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>