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 正则表达式不是正则表达式,而是堆栈机器。对于(?&lt;Group&gt;.*) 组,您实际上将一个条目添加到该组的堆栈中。使用(?&lt;-Group&gt;),您可以从该堆栈中删除一个条目。也可以测试栈是否为空。

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

[\(,]([^\(\)]|(?&lt;Par&gt;\()|(?&lt;-Par&gt;\)))*(?(Par)---|[,\)])

应该工作,其中--- 用作转义序列。如果您立即理解该“正则表达式”,那么我认为您很高兴。在所有其他情况下,我宁愿建议您手动编写解析器。否则,您在测试后 5 分钟内将无法理解您的代码。

【讨论】:

感谢您的提示!我最终手动解析了表达式,因为如果我将来需要更改某些内容,它将更具可读性。

以上是关于VB.Net/C# - 在自定义函数上拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

在自定义容器控制器中拆分视图控制器?

如何在自定义 R 函数中使用文本字符串作为变量

无法一致地获取在自定义 MKAnnotationView 上调用的 mapViewdidSelectView 函数

如何在自定义函数中使用 mutate 创建新列

在自定义样式组件模板字符串上运行 stylelint

在自定义承诺上使用异步等待