使用C#

时间:2018-01-19 06:42:04

标签: c# string split comma brackets

我有这样的字符串。

string str = "ZeroIfNegative((NonApodCapacity()*0.65*0.9), 1) - ZeroIfNegative(P.BDFWU.dmd_dpt_fc + P.BDFW.dmd_dpt_fc  - NonApodCapacity(1,2)*0.35)";

我想相应地拆分它以获取与其参数一起使用的方法(如果存在),例如

ar[0] = ZeroIfNegative((NonApodCapacity()*0.65*0.9), 1)
ar[1] = ZeroIfNegative(P.BDFWU.dmd_dpt_fc + P.BDFW.dmd_dpt_fc  - NonApodCapacity(1,2)*0.35)

和内部方法也将NonApodCapacity(1,2)作为另一个字符串。

基本上我想用它的参数验证这个方法名,而参数可以再次是一个方法。

3 个答案:

答案 0 :(得分:0)

这可能会变得非常复杂,具体取决于" deep"验证应该是。我为一些有效和无效的例子设置了一些例子。您是否需要确保有效的方法名称,参数类型,计数,正确的嵌套等?从一个简单的例子开始。像:

假设这是有效的:NonApodCapacity(1,2)*0.35+P.BDFW.ab

但是NonApodCapacity(5,6,7,8)*0.35+P.BDFW.ab如何呢 或NonApodCapacity(1,2)*3,5+P.BDFW.ab
UnknownFunctionName(1,2)*0.35+P.BDFW.ab
NonApodCapacity(1,2))*0.35+P.BDFW.ab
NonApodCapacity(1,2))*0.35+P.BDFWXYZ.abcde
或者更多可能的验证...

(到处发现不同类型的错误?)

如果我的所有示例都应该被拒绝,那么你在这里得到的是一个表达式树,需要使用相当复杂的算法进行解析。

良好的开端是MSDN上的Split-and-Merge Expression Parser in C# Article。 (这里没有代码片段,因为我不打算提供功能代码位,只是给你一些资源以便进一步阅读)

如果您只是将字符串拆分成片段并验证每个组件,这很容易,但您的验证将永远不会涵盖上述所有情况。

例如,您可以通过分隔符列表(例如,(space)*+ ...)和每个组件拆分整个公式你找到了,检查它是否是一个号码。如果没有,它可能是变量/字段名称,或者它是方法名称,您可以将其与已知方法名称列表进行比较。

答案 1 :(得分:0)

基本上,计算括号的开启和关闭将解决问题。

var str = "ZeroIfNegative((NonApodCapacity()*0.65*0.9), 1) - ZeroIfNegative(P.BDFWU.dmd_dpt_fc + P.BDFW.dmd_dpt_fc - NonApodCapacity(1,2)*0.35)";

int op_count = 0; // close paren counter
int p_count = 0; // open paren counter
List<string> methods = new List<string>(); // storage of functions
string currentFunc = ""; // the current function

for (var i = 0; i < str.length; i++) {
    currentFunc += str[i].toString();
    if (string.isNullOrEmpty(str[i].toString())) {
        if (op_count == cp_count && (op_count > 0 && cp_count > 0)) {
            // add the method to the collection
            methods.Add(currentFunc);
            // reset
            op_count = 0;
            cp_count = 0;
            currentFunc = "";
        }   
    }
    // if its the last character, add it as new method
    if (i == str.length - 1) {
        methods.Add(currentFunc);
    }

    if (str[i] == '(') {
        op_count++;
    }
    if (str[i] == ')') {
        cp_count++;
    }
}   

// print the result
foreach (var m in methods) {
    Console.Writeline(m);
}

the result will be
ZeroIfNegative((NonApodCapacity()*0.65*0.9), 1) 
- ZeroIfNegative(P.BDFWU.dmd_dpt_fc + P.BDFW.dmd_dpt_fc -  NonApodCapacity(1,2)*0.35)

答案 2 :(得分:-1)

您可以使用C#split函数拆分字符串,例如

string str =&#34;巴基斯坦是我的家园&#34;;

//在分割函数中,你可以根据你的要求传递空格或任何其他符号

string [] firstValue = str.Split(&#39;,&#39;);