gpt4 book ai didi

c# - 形成一个正则表达式来解析数值表达式

转载 作者:行者123 更新时间:2023-11-30 17:39:41 24 4
gpt4 key购买 nike

我正在尝试解析字符串形式的数值比较。我想标记一个字符串,例如 45+(30*2)<=50这样得到的组是 45 , + , (30 * 2) , <= , 和 50 .

我知道我可以将我的组定义为

  • \w*对于数字术语
  • \(.*\)对于附加条款
  • [\+\-\*\\=<>]{1,2}运营商条款

但我不知道怎么说“一个数字或括号中的术语后跟一个操作术语,并且整个事情重复了任意次数,以数字或括号中的术语结尾”。

这样的事情可以用正则表达式吗?

最佳答案

正则表达式并不是完成这项工作的最佳工具。您可以用它们实现您想要的,但您必须克服困难。

第一个是嵌套结构,如 45+((10 + 20)*2)<=50 ,所以让我们首先开始研究,如 \(.*\)不会对你有任何好处。它渴望并且不知道嵌套结构。

这里有一个更好的括号模式:

(?>
(?<p>\()
|(?<-p>\))
|(?(p)[^()])
)+
(?(p)(?!))

是的,这就是它所需要的。了解 balancing groups以获得对此的深入解释。

数字项将匹配 \d+[0-9]+ (仅适用于 .NET 中的 ASCII 数字),而不是 \w+ .

关于你的问题:

A numerical or parenthetical term followed by an operational term, and that whole thing repeated any number of times, ending in a numerical or parenthetical term

你试图做错了。虽然您可以使用 PCRE 正则表达式做到这一点,但在 .NET 中会困难得多。

您可以使用正则表达式进行词法分析(又名分词)。但随后使用应用程序代码来理解正则表达式返回给您的标记。不要将正则表达式用于语义,你不会得到漂亮的代码。

也许您应该使用现有的数学解析库,例如 NCalc .

或者您可能需要使用自定义解决方案和 build your own parser ...

关于c# - 形成一个正则表达式来解析数值表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35218788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com