0

在我要解决的一个问题中,我必须用等效的单元格引用替换 Excel 公式中的范围值,例如,如果我有一个 Excel 公式:

=总和(F10:F14)

我必须将其替换为:

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

我正在尝试匹配有助于我找到的正则表达式

  1. 如果 Excel 公式已使用包含以下模式的模式定义:“Sum”和“:”
  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),即公式中涉及多个范围运算符的情况

请帮助我找出如何实现上述结果?

干杯,阿尼尔

4

2 回答 2

1

Excel 可以让您拥有单元格块和单个单元格,这些单元格可以作为 @mgibsonbr 的答案,我可以:

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

这也确保您只有两个单元格用于一个范围......即。不是 a2:a3:a4

于 2013-02-20T19:47:16.823 回答
1

首先,我建议使用更简单的正则表达式,例如:

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

(我不知道 excel 是否支持非贪婪量词,如果不支持,使用*代替*?,也可以工作 - 但效率较低)

这也将匹配除间隔之外SUM任何内容,这可能是也可能不是您想要的。如果它必须是单元格或间隔,则正则表达式将变得更加复杂,但它是可行的:您只需将其分解为这两个简单的情况或一起:

  • 一个间隔、零个或多个间隔或以逗号开头的单元格;
    • \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我不确定您是否必须转义命令或冒号。

于 2012-05-19T06:34:13.810 回答