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 中使用正则表达式我想提取键=值对,如下所示
start=("a", "b")
between=("range(2019, max, to=\"le\")")
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+=(\((?:[^("]*"(?:[^\"]|\.)*"[^("]*)*(\)))
我有以下 key=value 对作为一行 string
的示例
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")
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 matchbetween=("a",,,)
but will matchbetween=("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+=(\((?:[^("]*"(?:[^\"]|\.)*"[^("]*)*(\)))