2012-05-19 109 views
0

在我一個問題要解決,我必須代替我的取值範圍在Excel公式與他們相當的單元格引用,即,例如,如果我有一個Excel公式:正則表達式匹配Excel公式

= SUM(F10:F14)

我有來代替它:

= SUM(F10,F11,F12,F13,F14)。

我想匹配的正則表達式,這有助於我找到

  1. 如果一個Excel公式已與模式,其中包括定義爲:「點心」和「:」
  2. 要提取細胞被包括在範圍內,如在F10:F14

不知何故,我停留在點1 :-)

因爲,這我創建以下模式:

Regex formulaMatcher = new Regex(@"=*SUM\([\w]*[\w,]*[\w]+:[\w]+[\w]*[\w,]*\)*"); 
foreach (Match m in formulaMatcher.Matches("=SUM(F55,F151:F159)")) 
    m.Value.Dump(); 

現在,上面的圖案是可以正常使用的公式:

 // =SUM(F15,F25,F31:F35) 
     // =SUM(F10:F12,F26,F31) 
     // =SUM(F45,F55,F61:F63,F40) 
     // =F14-SUM(F16:F17) 
     // =SUM(F35:F37) 
     // =SUM(F10:F13)-F11 
     // =SUM(F27:F29)/3 
     // =F19-F21+SUM(F22:F23) 
     // =ROUND(F43-SUM(F23:F42),2) 
     // =SUM(F174:F178)+F134+F120+F97 

但失敗了:SUM(F81:F89,F105:F113,F128:F135),即,對公式中涉及多個範圍運算符的案例

請幫助我瞭解如何實現上述結果?

乾杯, 阿尼爾

+0

我認爲這是家庭主婦 - 否則這是一個很奇怪的問題 – brettdj

回答

1

起初,我建議使用一個簡單的正則表達式,如:

Regex formulaMatcher = new Regex(@"=*SUM\(.*?[\w]+:[\w]+.*?\)*"); 

(我不知道如果Excel支持非貪婪量詞,如果它不「T,使用*代替*?,也將工作 - 但效率較低)

這也將匹配SUM除了interva任何內容ls,這可能是也可能不是你想要的。如果必須是甫一細胞或區間,正則表達式將變得更爲複雜,但它是可行的:你必須要打破它這兩個簡單的情況或運算在一起:

  • 一個區間,以逗號開頭的零個或多個區間或單元格;
    • \w+:\w+(,\w+(:\w+)?)*
  • 一個小區,零個或更多個細胞開始逗號,間隔開始逗號,零個或多個間隔或開始逗號細胞)。
    • \w+(,\w+)*,\w+:\w+(,\w+(:\w+)?)*

編輯:沒關係,你可以把它簡化爲:

  • 零個或多個細胞與逗號
    • (\w+,)*
  • 0結束
  • 一個間隔
    • \w+:\w+
  • 零或多個小區或間隔開始逗號
    • (,\w+(:\w+)?)*

結果:

Regex formulaMatcher = new Regex(@"=*SUM\((\w+,)*\w+:\w+(,\w+(:\w+)?)*\)*"); 

P.S.我不確定你是否必須逃脫指揮官或冒號。

1

Excel中讓你的細胞和單細胞塊,所產生的@mgibsonbr的答案,我可以了:

^=SUM\((\w+\d+)((:\w+\d+)|(,\w+\w+)*)((,\w+\d)((:\w+\d+)|(,\w+\w+)*))*\)$ 

這也可以確保你只有兩個單元的範圍內,即... 。不是a2:a3:a4