【发布时间】:2021-01-31 00:02:22
【问题描述】:
我觉得我太笨了,无法解决这个问题……
我有一些公式需要从一种语法“翻译”到另一种语法。 假设我有一个这样的公式(这是一个简单的公式,其他公式中有很多“天花板”):
string formulaString = "If([Param1] = 0, 1, Ceiling([Param2] / 0.55) * [Param3])";
我需要将“Ceiling()”替换为“Ceiling(;1)”(基本上,在“)”之前插入“;1”)。 我的尝试是在“Ceiling(”处拆分 fomulaString,这样我就可以遍历字符串数组并将字符串插入到正确的索引处(计算每个“(”和“)”以获得正确的索引)
到目前为止我所拥有的:
//splits correct, but loses "CEILING("
string[] parts = formulaString.Split(new[] { "CEILING(" }, StringSplitOptions.None);
//splits almost correct, "CEILING(" is in another group
string[] parts = Regex.Split(formulaString, @"(CEILING\()");
//splits almost every letter
string[] parts = Regex.Split(formulaString, @"(?=[(CEILING\()])");
当一切都完成后,我将字符串连接起来,这样我又得到了完整的公式。
我必须将什么设置为正则表达式模式才能实现此示例? (或任何其他对我有帮助的方法)
part1 = "If([Param1] = 0, 1, ";
part2 = "Ceiling([Param2] / 0.55) * [Param3])";
//part3 = next "CEILING(" in a longer formula and so on...
【问题讨论】:
-
你可以像这样使用
String.Join(char separator, string[] value)加入字符串:String.Join ("CEILING(", parts)而不是连接它。 -
我有一些公式需要从一种语法“翻译”到另一种语法:根据转换的整体复杂性,可能值得一看 @ 987654322@.
-
你几乎明白了:
(?=Ceiling)在正则表达式中使用正前瞻零断言。 regular-expressions.info/lookaround.html -
感谢所有评论员,我会进一步查看您提供给我的所有链接。由于语法翻译相对容易(只需在右括号前插入一些字符串),我将坚持使用 Regex.Split()