[英]Fast String Replace with Wildcard
將舊程序轉換為ASP.NET c#站點。
我有一個充滿函數的表和一個充滿變量及其相應值的表。 我編寫了一個函數來評估答案,但需要格式化公式才能傳遞變量。
例如:
V(totalValue) * V(CoFriction(s)) ==> V("totalValue") * V("CoFriction(s)")
如何將V(<variable>)
替換為V("<variable>")
。 嵌套括號是可能的!
我試過regexp就像V\\([^\\(\\)]+\\)
只能在嵌套的paren上失敗。
您可以使用平衡組在.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);
正則表達式完全適用於已發布的場景 - 如果輸入無效,它將失敗,因此您認為它是(具體地說,當您有額外的右括號時)。
我過去曾經建立過這樣的圖書館。 您想要的正則表達式功能稱為“平衡組”。 在http://blog.stevenlevithan.com/archives/balancing-groups上有一篇很好的文章我認為你想要這樣的東西:
V\((?>[^()]+|\( (?<Depth>)|\) (?<-Depth>))*(?(Depth)(?!))\)
如果我沒記錯的話,當它看到一個打開的paren時,它本質上會在“Depth”堆棧上添加一個paren,當它看到一個緊密的paren時,將它從“Depth”堆棧中刪除(如果堆棧上沒有它失敗),然后失敗的開放式paren沒有關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.