与正则表达式中的打开/关闭对字符匹配

时间:2010-03-03 19:24:54

标签: 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或B>”)。我计算出以下模式,但它删除了尾随括号。

\((Foo\.)(.*?)\)

所以我没有得到我正在寻找的东西,而是得到了:

  

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

这是两个括号短。

问题是我需要在。*中包含右括号。匹配 IF 那里还有一个左括号。我还没弄明白怎么做,有人知道吗?

PS - 代码是C#.NET,但除非解决方案涉及一些模糊的语言特定的RegEx内容,否则无关紧要。

1 个答案:

答案 0 :(得分:4)

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

我会通过普通代码来做。进行搜索以找到"(Foo.",然后创建一个迭代后续字符的循环,保留一个计数器,表明您已经传递了多少个打开/关闭括号。当你点击(时递增它,当你点击)时递减。如果您点击右括号并且计数器为0,则表示您需要捕获的字符串的结尾。在此时停止捕获,取出该字符串并将其放入您要添加的Any()内。然后找到下一个"(Foo."

这有意义吗?如果你没有真正遵循我的意思,我可能会伪造它。当然,如果你能够放弃正则表达式,这只是一个有效的选择。