簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM