2010-11-01 61 views
3

将旧程序转换为ASP.NET c#站点。用通配符替换快速字符串

我有一个充满函数的表格和一个充满变量及其对应值的表格。我写了一个函数来计算的答案,但需要以传递变量在格式化公式

例如:

V(totalValue) * V(CoFriction(s)) ==> V("totalValue") * V("CoFriction(s)") 

我怎么能代替V(<variable>)V("<variable>")。嵌套括号是可能的!

我试过regexp像 - V\([^\(\)]+\)只能在嵌套paren失败。

+1

那么,如果嵌套括号是允许/可能的,你将如何确定什么时候该值是一个字符串文字,什么时候不是?当一个被视为字符串字面值的函数将另一个函数作为一个参数时,它又意味着什么,这个参数也必须被视为一个字符串文字?在我看来,您需要编写一个简单的递归下降解析器,只要它找到它知道的函数名称,就会开始括号匹配,直到找到右括号并用引号包围整个区域。否则,你将不得不在运行时评估命名函数。 – Kell 2010-11-01 18:06:04

回答

2

您可以在.NET中使用均衡组achive它:

string s = "V(totalValue) * V(CoFriction(s)) * V(a(()b)c()d((())))"; 

string vPattern = 
@"V\(
(  #capturing group, for $1 to work 
    (?: 
     (?<open>\()| #push to stack OR 
     (?<-open>\))| #pop from stack OR 
     [^()]   #match anything else 
    )+? 
) 
(?(open)(?!)) #assert there are not extra (
\)"; 

s = Regex.Replace(s, vPattern, "V(\"$1\")", RegexOptions.IgnorePatternWhitespace); 

正则表达式的工作准确的发布场景 - 如果输入无效,它就会失败,所以你认为它是(具体来说,当你有额外的右括号时)。

+0

哇,我学到了一些新东西:)但是,我不知道我会永远使用它! – Kell 2010-11-02 10:06:26

+0

@Kell - 谢谢。 .Net和超出娱乐特有的这种记法只有有限的使用,但它非常适合这种情况 - 它允许捕获平衡的令牌,但不捕获每个单独的括号。当然,手动计算括号并不难,这是一个有效的解决方案。 – Kobi 2010-11-02 10:28:40

1

我已经在过去构建过这样的库。您想要的正则表达式功能称为“平衡组”。有在http://blog.stevenlevithan.com/archives/balancing-groups是一个很好的书面记录我想你想是这样的:

V\((?>[^()]+|\((?<Depth>)|\) (?<-Depth>))*(?(Depth)(?!))\) 

如果我没记错的话,这将基本上是添加括号到“深度”栈,当它看到一个开放的括号,从中删除了“深度“堆栈,当它看到一个关闭的文件时(如果堆栈上没有任何文件出现故障),然后打开的文件没有关闭。