将旧程序转换为ASP.NET c#站点。
我有一个充满函数的表和一个充满变量及其相应值的表。我编写了一个函数来评估答案,但需要格式化公式才能传递变量。
例如:
V(totalValue) * V(CoFriction(s)) ==> V("totalValue") * V("CoFriction(s)")
如何将V(<variable>)
替换为V("<variable>")
。嵌套的括号是可能的!
我试过regexp就像 - V\([^\(\)]+\)
一样,只能在嵌套的paren上失败。
答案 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没有关闭。