2010-05-25 148 views
0

内的文本组我有字符串的格式如下:匹配(和替换)的字符串

嗒嗒IIF((doc.PostTypeId == 1),(解析(doc.Id)> 1000), (doc.ParentId> 1000))等等

,我想将其转换为:

等等(doc.PostTypeId == 1解析(doc.Id?)> 1000:doc.ParentId> 1000 )等等

到目前为止,我使用的是下面的正则表达式字符串匹配

IIF\((?<one>[^,]*?),\ (?<two>[^,]*?),\ (?<three>[^,]*)\)

但我有平衡所有的括号的问题,有没有更好的办法或正则表达式,这个错误的工具?

+0

什么语言? – 2010-05-25 20:55:46

+0

你绝对不得不摆脱内部括号吗?如果没有,看起来你的正则表达式会更简单。 – John 2010-05-25 20:57:59

+0

@约翰,没有内部括号可以留下,如果这是更容易。 @Bears,我做它在C#中,但我认为正则表达式是相当普遍的? – 2010-05-25 21:04:58

回答

1

一般的正则表达式不能处理正确平衡括号,因为这样做需要计数的嵌套,这可能是任意深的深度,和正则表达式只能存储状态的有限的(一般来说) 。

这就是说,我会假设你正在做的改变并不比,比如说,三个或四个深嵌套更深入的括号 - 在这种情况下,它成为可能。以下是如何建立起来:

很容易搭配,在所有不带括号的序列:

EXPR0: [^()]* 

我们可以用它来建立符合括号中有一个非嵌套表达正则表达式:

PAREN1: \(EXPR0\) 

表达式最多包含一个括号?好吧,这只是一个非括号字符PAREN1s的混合物

EXPR1: (?:PAREN1|EXPR0)* 

鉴于此,我们当然可以匹配括号中的均衡表达与嵌套高达一层:

PAREN2: \(EXPR1\) 

这我们可以延伸到匹配任何均衡的表达与不超过两个级别()中相同的方式

EXPR2: (?:PAREN2|EXPR0)* 

等:

PAREN3: \(EXPR2\) 
EXPR3:  (?:PAREN3|EXPR0) 
PAREN4: \(EXPR3\) 
... 

然后可以使用这个来构建你的对手想要做的更换 - 沿着线的东西:

IIF\(?<one>EXPR5),(?<two>EXPR5),(?<three>EXPR5)\) 

(实际上你需要调整的东西,这样的EXPR5表达式唐“T匹配unparenthesised逗号,但应足够清楚该怎么做,我希望:)

当然,你必须写一个短的一次性程序来生成所需的重而不是手动构建它!

+0

我很欣赏的深入的答案,我希望我可以给你更多的+1为你付出努力! – 2010-05-27 09:52:32