给定以下文本:
{field1} == value1 && {field2} == value2 && ({field3} == value3 && {field4} == value4) && {field5} == value5
我正在尝试创建一个正则表达式来匹配该文本上的所有
&&
,但不包括括号之间的那些(因此应该忽略 value3 和 field4 之间的 && )。我已经能够使用以下正则表达式来做到这一点:(\&{2})(?![^\(]*\))
[这个有效并且它正在做我需要的]但问题是我使用的是 Golang 并且不支持负前瞻。有什么办法可以做到没有消极的先行?括号不能嵌套
基本上我想被
&&
分开但忽略括号之间的那些并得到类似的东西:
[&&, &&, &&]
[{field1} == value1, {field2} == value2, ({field3} == value3 && {field4} == value4), {field5} == value5]
谢谢!
您可能使用的一种方法是匹配但不捕获您不想要的一切,匹配并捕获您想要的一切。您可以使用以下正则表达式来做到这一点。
\([^\]]*\)|(&&)
显示为“匹配括号中的字符串或 (
|
) 匹配字符串 "&&"
并将其保存到捕获组 1”。这个想法是(在代码中)忽略未捕获的匹配项。
对于以下字符串,显示匹配项(由
"m"
s 表示)和捕获(由"c"
s 表示)。
{f1} == v1 && {f2} == v2 && ({f3} == v3 && {f4} == v4) && {f5} == v5
mm mmmmmmmmmmmmmmmmmmmmmmmmmm mm
cc cc
在字符串的开头(
{
),\([^\]]*\)
和(&&)
都不匹配,所以字符串指针前移一个字符到f
。同样,没有匹配项,所以字符串指针向前移动一个字符,到 1
。这将继续(没有匹配项),直到达到第一个&
。 \([^\]]*\)
不匹配,但 (&&)
匹配。我们对那场比赛很感兴趣,因为它被捕获了(捕获第 1 组)。
然后字符串指针一次向前移动一个字符,没有找到更多匹配项,直到到达
(
。在这一点上,({f3} == v3 && {f4} == v4)
与 \([^\]]*\)
相匹配,但由于它没有被捕获,我们没有关注它。这一直持续到到达字符串的末尾。
或者,我们可以使用正则表达式
\([^\]]*\)|&&
并检查每个匹配项的第一个字符。如果是
(
,我们将不考虑匹配。
当找到
&&
的每个匹配项时,我们可能(在代码中)将其替换为另一个(可能为空)字符串,获取其在字符串中的偏移量(出于某种目的)或简单地增加字符串中匹配项数的计数器.这当然取决于我们为什么要匹配这些字符串。