首先,一点背景。我的字符串类似于以下内容:
((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内容,否则无关紧要。
答案 0 :(得分:4)
您是否有必要使用正则表达式执行此操作?试图找到“匹配”对是正则表达式做得不好的事情之一。
我会通过普通代码来做。进行搜索以找到"(Foo."
,然后创建一个迭代后续字符的循环,保留一个计数器,表明您已经传递了多少个打开/关闭括号。当你点击(
时递增它,当你点击)
时递减。如果您点击右括号并且计数器为0,则表示您需要捕获的字符串的结尾。在此时停止捕获,取出该字符串并将其放入您要添加的Any()
内。然后找到下一个"(Foo."
。
这有意义吗?如果你没有真正遵循我的意思,我可能会伪造它。当然,如果你能够放弃正则表达式,这只是一个有效的选择。