匹配正则表达式中的开始/结束对字符

Nic*_*tch 2 regex pattern-matching

首先,介绍一下背景。我有类似于以下内容的字符串:

((Foo.Bar.StartsWith("A")) && (Foo.Bar.EndsWith("B")))

我正在尝试将这些重新格式化为如下所示:

((Foo.Any(Bar.StartsWith("A"))) && (Foo.Any(Bar.EndsWith("B"))))

旁注: .Bar 后面的部分有时可能不包含 (),例如 .Bar == "AB" 。

我试图捕捉两个群体:Foo。和 Bar.StartsWith("<A or B>") 。我制定了以下模式,但它删除了尾随括号。

\((Foo\.)(.*?)\)
Run Code Online (Sandbox Code Playgroud)

因此,我得到的不是我想要的,而是:

((Foo.Any(Bar.StartsWith("A")) && (Foo.Any(Bar.EndsWith("B")))

这是两个括号短。

问题是我需要在 .* 中包含右括号?如果那里还有一个左括号,则匹配。我还没想好怎么做,有人知道吗?

PS - 代码是 C#.NET 但这应该无关紧要,除非解决方案涉及一些晦涩的语言特定的 RegEx 内容。

Cha*_*rch 5

您是否有理由必须使用正则表达式来执行此操作?试图找到“匹配”对是正则表达式做得不好的事情之一。

我只会通过普通代码来完成。搜索 find "(Foo.",然后循环遍历后续字符,保留一个计数器,记录您传递了多少个开/关括号。击中 a 时递增,击中 a 时(递减)。如果您点击右括号并且计数器为 0,那么这就是您需要捕获的字符串的结尾。在那一点停止捕获,把那个字符串放在Any()你要添加的里面。然后找到下一个"(Foo."

那有意义吗?如果您没有真正遵循我的意思,我可能可以对它进行伪代码。当然,如果您无论如何都可以放弃正则表达式,这只是一个有效的选择。