正则expression式匹配Excel公式
在我要解决的一个问题中,我不得不用我的范围值在一个Excel公式与他们的等效单元格引用,即,例如,如果我有一个Excel公式:
=总和(F10:F14)
我必须将其replace为:
=和(F10,F11,F12,F13,F14)。
我想匹配正则expression式,帮助我find
- 如果一个Excel公式已被定义为一个模式,其中包括:“总和”和“:”
- 提取包含在该范围内的单元格,如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