C#:需要将一个字符串拆分成一个字符串[],并将分隔符(也是一个字符串)保留在字符串的开头

白花百合

我觉得我太笨了,无法解决这个问题......

我有一些公式需要从一种语法“翻译”到另一种语法。假设我有一个这样的公式(这是一个简单的公式,其他公式中有很多“天花板”):

string formulaString = "If([Param1] = 0, 1, Ceiling([Param2] / 0.55) * [Param3])";

我需要用“Ceiling(; 1)”替换“Ceiling()”(基本上,在“)”之前插入“; 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\()])");

一切都完成后,我将字符串连接起来,以便再次获得完整的公式。

我必须将什么设置为 Regex 模式才能实现此示例?(或任何其他对我有帮助的方法)

part1 = "If([Param1] = 0, 1, ";
part2 = "Ceiling([Param2] / 0.55) * [Param3])";
//part3 = next "CEILING(" in a longer formula and so on...
白花百合

这是我的解决方案:

private string ConvertCeiling(string formula)
{
    int ceilingsCount = formula.CountOccurences("Ceiling(");

    int startIndex = 0;
    int bracketCounter;
    for (int i = 0; i < ceilingsCount; i++)
    {
        startIndex = formula.IndexOf("Ceiling(", startIndex);

        bracketCounter = 0;
        for (int j = 0; j < formula.Length; j++)
        {
            if (j < startIndex) continue;

            var c = formula[j];
            if (c == '(')
            {
                bracketCounter++;
            }
            if (c == ')')
            {
                bracketCounter--;
                if (bracketCounter == 0)
                {
                    // found end
                    formula = formula.Insert(j, "; 1");
                    startIndex++;
                    break;
                }
            }
        }
    }
    return formula;
}

和 CountOccurence:

public static int CountOccurences(this string value, string parameter)
{
    int counter = 0;
    int startIndex = 0;
    int indexOfCeiling;
    do
    {
        indexOfCeiling = value.IndexOf(parameter, startIndex);
        if (indexOfCeiling < 0)
        {
            break;
        }
        else
        {
            startIndex = indexOfCeiling + 1;
            counter++;
        }

    } while (true);
    return counter;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章