2010-11-01 44 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)(?!))\) 

如果我沒記錯的話,這將基本上是添加括號到「深度」棧,當它看到一個開放的括號,從中刪除了「深度「堆棧,當它看到一個關閉的文件時(如果堆棧上沒有任何文件出現故障),然後打開的文件沒有關閉。