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

Regex 与正则表达式中的开始/结束对字符匹配,regex,pattern-matching,Regex,Pattern Matching,首先,一点背景。我有如下类似的字符串: ((Foo.Bar.StartsWith(“A”))&& (Foo.Bar.EndsWith(“B”)) 我正试图将它们重新格式化为这样: ((Foo.Any(Bar.StartsWith(“A”)))&& (以下简称“B”)) 旁注:在.Bar后面的部分有时可能不包括(),比如.Bar==“AB” 我试图抓住两个群体:Foo。和酒吧。以(“”)开头。我算出了下面的模式,但它去掉了后面的括号 \((Foo\.)(.*?)\) 因此,我得到的不是我想要的,

首先,一点背景。我有如下类似的字符串:

((Foo.Bar.StartsWith(“A”))&& (Foo.Bar.EndsWith(“B”))

我正试图将它们重新格式化为这样:

((Foo.Any(Bar.StartsWith(“A”)))&& (以下简称“B”))

旁注:在.Bar后面的部分有时可能不包括(),比如.Bar==“AB”

我试图抓住两个群体:Foo。和酒吧。以(“”)开头。我算出了下面的模式,但它去掉了后面的括号

\((Foo\.)(.*?)\)
因此,我得到的不是我想要的,而是:

((Foo.Any(Bar.StartsWith(“A”))&& (以下简称“B”))

短了两个括号

问题是我需要在.*?匹配中包含右括号,如果其中还有一个左括号。我还没有弄明白如何做,有人知道吗


PS-代码是C#.NET,但这并不重要,除非解决方案涉及到一些模糊的特定于语言的正则表达式内容。

有什么理由必须对正则表达式这样做吗?试图找到“匹配”对是正则表达式做得不好的事情之一

我会用普通的代码来做。搜索以找到
“(Foo.”
,然后循环遍历后续字符,保留一个计数器来计算你传递了多少个开/闭括号。当你点击
时递增(
当你点击
时递减)
。如果你点击一个右括号,计数器在0,那就是你需要捕获的字符串的末尾。在该点停止捕获,将该字符串放入你要添加的
Any()
中。然后找到下一个
“(Foo)。


这有意义吗?如果你没有真正理解我的意思,我可能会对它进行伪编码。当然,只有在你能够放弃正则表达式的情况下,这才是一个有效的选项。

你正在使用的替换模式是什么?听起来你只需要在替换模式的末尾添加一个紧括号。@ar放置模式只是添加了Any(),因此替换为:“$1Any($2)”。在替换中添加(Any)的问题在于,我并不总是保证第二个匹配组实际上包含括号(我上面的旁注)如果没有,那么添加的括号将使其不正确。我使用regex是因为乍一看它似乎是一个快速、简单的解决方案。直到我遇到这个障碍。我正在按照您推荐的方式进行操作,因为它使事情变得更简单。谢谢!