正则expression式匹配Excel公式

在我要解决的一个问题中,我不得不用我的范围值在一个Excel公式与他们的等效单元格引用,即,例如,如果我有一个Excel公式:

=总和(F10:F14)

我必须将其replace为:

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

我想匹配正则expression式,帮助我find

  1. 如果一个Excel公式已被定义为一个模式,其中包括:“总和”和“:”
  2. 提取包含在该范围内的单元格,如F10:F14所示

不知何故,我被困在第一点:-)

为此,我创build了以下模式:

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),即对于涉及公式

请帮助我找出如何达到上述结果?

欢呼,Anil

起初,我build议使用更简单的正则expression式,如:

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

(我不知道如果excel支持非贪婪的量词,如果不是,使用*而不是*?也可以 – 但效率较低)

这也将SUM与除了间隔之外的任何内容相匹配,这可能是也可能不是你想要的。 如果它必须是单元格或间隔,那么正则expression式将变得复杂得多,但它是可行的:你只需要把它分解成两个简单的例子或者一起:

  • 一个间隔,零个或多个间隔或以逗号开头的单元格;
    • \w+:\w+(,\w+(:\w+)?)*
  • 一个单元格,零个或多个以逗号开始的单元格,以逗号开始的间隔,零个或多个间隔或以逗号开头的单元格)。
    • \w+(,\w+)*,\w+:\w+(,\w+(:\w+)?)*

编辑:没关系,你可以简化它:

  • 零个或多个以逗号结尾的单元格
    • (\w+,)*
  • 一个区间
    • \w+:\w+
  • 以逗号开始的零个或多个单元格或间隔
    • (,\w+(:\w+)?)*

结果:

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

PS我不确定你是否要逃脱指挥官或冒号。

Excel可以让你有单元格和单元格的块,为@mgibsonbr的答案,我可以与:

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

这也确保你只有两个单元格范围…即。 不是a2:a3:a4