正则表达式从匹配中排除括号之间的文本

问题描述 投票:0回答:1

给定以下文本:

{field1} == value1 && {field2} == value2  && ({field3} == value3 && {field4} == value4) && {field5} == value5

我正在尝试创建一个正则表达式来匹配该文本上的所有

&&
,但不包括括号之间的那些(因此应该忽略 value3 和 field4 之间的 && )。我已经能够使用以下正则表达式来做到这一点:
(\&{2})(?![^\(]*\))
[这个有效并且它正在做我需要的]但问题是我使用的是 Golang 并且不支持负前瞻。有什么办法可以做到没有消极的先行?括号不能嵌套

基本上我想被

&&
分开但忽略括号之间的那些并得到类似的东西:

[&&, &&, &&]
[{field1} == value1, {field2} == value2, ({field3} == value3 && {field4} == value4), {field5} == value5]

谢谢!

regex go
1个回答
0
投票

您可能使用的一种方法是匹配但不捕获您不想要的一切,匹配并捕获您想要的一切。您可以使用以下正则表达式来做到这一点。

\([^\]]*\)|(&&)

显示为“匹配括号中的字符串或 (

|
) 匹配字符串
"&&"
并将其保存到捕获组 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)
\([^\]]*\)
相匹配,但由于它没有被捕获,我们没有关注它。这一直持续到到达字符串的末尾。

或者,我们可以使用正则表达式

\([^\]]*\)|&&

并检查每个匹配项的第一个字符。如果是

(
,我们将不考虑匹配。

当找到

&&
的每个匹配项时,我们可能(在代码中)将其替换为另一个(可能为空)字符串,获取其在字符串中的偏移量(出于某种目的)或简单地增加字符串中匹配项数的计数器.这当然取决于我们为什么要匹配这些字符串。

© www.soinside.com 2019 - 2024. All rights reserved.