【问题标题】:VB.Net/C# - Split string on custom functionVB.Net/C# - 在自定义函数上拆分字符串
【发布时间】: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...

标签: c# regex vb.net


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的提示!我最终手动解析了表达式,因为如果我将来需要更改某些内容,它将更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多