使用通配符替换快速字符串

时间:2010-11-01 17:13:21

标签: c# asp.net regex string

将旧程序转换为ASP.NET c#站点。

我有一个充满函数的表和一个充满变量及其相应值的表。我编写了一个函数来评估答案,但需要格式化公式才能传递变量。

例如:

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

如何将V(<variable>)替换为V("<variable>")。嵌套的括号是可能的!

我试过regexp就像 - V\([^\(\)]+\)一样,只能在嵌套的paren上失败。

2 个答案:

答案 0 :(得分:2)

您可以使用平衡组在.net中实现它:

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);

正则表达式完全适用于发布的场景 - 如果输入无效,它将失败,因此您认为它是(具体地说,当您有额外的结束括号时)。

答案 1 :(得分:1)

我过去曾经建立过这样的图书馆。您想要的正则表达式功能称为“平衡组”。在http://blog.stevenlevithan.com/archives/balancing-groups有一个很好的写作我觉得你想要这样的东西:

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

如果我没记错的话,当它看到一个打开的paren时,它本质上会在“Depth”堆栈上添加一个paren,当它看到一个紧密的paren时,将它从“Depth”堆栈中删除(如果堆栈上没有它失败),然后失败的开放式paren没有关闭。