2012-05-19 84 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