VB.Net/C# - 在自定义函数上拆分字符串
Posted
技术标签:
【中文标题】VB.Net/C# - 在自定义函数上拆分字符串【英文标题】:VB.Net/C# - Split string on custom function 【发布时间】:2017-11-05 11:29:35 【问题描述】:我正在开发一个自定义数学表达式计算器,但在解析嵌套条件表达式时遇到了问题:
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 函数,方法是获取括号内的内容并用逗号分隔:
\((.*?)\)
显然这不适用于这样的表达式,因为它会在第一个右括号处停止,因此我考虑使用它来获取所有其他字符:
\((.*?)\).*
但现在我不确定如何拆分它,因为不再使用逗号。
【问题讨论】:
如果要解析就写解析器.. 我没有从这种答案中受益。我确实写了一个解析器,但是我在解析上面指定的表达式类型时遇到了问题。 好吧,你可以使用this 之类的东西,但它看起来不正确。看起来不适合正则表达式。 我想得到第一个 IIF 函数的三个参数(条件、truePart、falsePart),就像我上面写的一样。 附注使用IF
运算符,而不是IIF
...
【参考方案1】:
理论上的答案是,正则表达式无法满足您的要求,因为它们“无法计数”。但是,您需要数数。
实践表明 .NET 正则表达式不是正则表达式,而是堆栈机器。对于(?<Group>.*)
组,您实际上将一个条目添加到该组的堆栈中。使用(?<-Group>)
,您可以从该堆栈中删除一个条目。也可以测试栈是否为空。
出于好奇,我试了一下,我相信
[\(,]([^\(\)]|(?<Par>\()|(?<-Par>\)))*(?(Par)---|[,\)])
应该工作,其中---
用作转义序列。如果您立即理解该“正则表达式”,那么我认为您很高兴。在所有其他情况下,我宁愿建议您手动编写解析器。否则,您在测试后 5 分钟内将无法理解您的代码。
【讨论】:
感谢您的提示!我最终手动解析了表达式,因为如果我将来需要更改某些内容,它将更具可读性。以上是关于VB.Net/C# - 在自定义函数上拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章