我有这样的字符串。
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)
作为另一个字符串。
基本上我想用它的参数验证这个方法名,而参数可以再次是一个方法。
答案 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;);