VB.Net/C# - 自定义函数上的拆分字符串

时间:2017-06-04 16:29:41

标签: c# regex vb.net

我正在研究自定义数学表达式计算器,但我在解析嵌套条件表达式方面遇到了问题,如下所示:

IIF("M"="M",(IIF(100 < 50,(IIF(2 > 0.45,2,1)),(IIF(2 > 0.45,4,3)))),(IIF(100 < 46,(IIF(2 > 0.45,2,1)),(IIF(2 >0.45,4,3)))))

我想做的是用逗号分割IIF函数以获取其参数:

Dim condition = "M"="M"
Dim truePart = (IIF(100 < 50,(IIF([2 > 0.45,2,1)),(IIF(2 >0.45,4,3))))
Dim falsePart = (IIF(100 < 46,(IIF(2 > 0.45,2,1)),(IIF(2 >0.45,4,3)))))

目前我正在使用正则表达式解析单个IIF函数,方法是获取括号内的内容并用逗号分隔:

\((.*?)\)

显然这对于​​这样的表达式不起作用,因为它会在第一个右括号处停止,因此我想用它来获取所有其他字符:

\((.*?)\).*

但现在我不确定如何分割它,因为使用逗号不再是一种选择。

1 个答案:

答案 0 :(得分:0)

理论的答案是正则表达式无法满足您的要求,因为它们“无法计数”。但是,你需要数数。

实践说.NET正则表达式不是正则表达式而是堆栈计算机。使用组(?<Group>.*),您实际上会在该组的堆栈中添加一个条目。使用(?<-Group>),您可以从该堆栈中删除条目。您还可以测试堆栈是否为空。

出于好奇,我尝试了一下,我相信

[\(,]([^\(\)]|(?<Par>\()|(?<-Par>\)))*(?(Par)---|[,\)])

应该有效,其中---用作转义序列。如果你马上理解“正则表达”,那么我觉得你很高兴。在所有其他情况下,我宁愿建议您手动编写解析器。否则,您在测试后5分钟就不会理解您的代码。