Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线性函数的正则表达式模式_C#_Regex - Fatal编程技术网

C# 线性函数的正则表达式模式

C# 线性函数的正则表达式模式,c#,regex,C#,Regex,我正在用C#创建一个科学计算器,我有一组线性函数,用户可以向其中添加条目。我需要预解析一个数学表达式,以检查这些函数以及其他数学函数的使用情况,跟踪函数的名称和(…)中的内容,并用它们的计算结果替换它们 以这个表达式为例: Ans1+(x*2)-(y^3)+abs(z)-avg(x, 5, Ans2)-my2ndFunc(y - (x * 2)) 我写了我自己的正则表达式,我需要在等式中匹配这些: abs(z) avg(x,5,Ans2) my2ndFunc(y-(x*2)) 我使用测试了它,

我正在用C#创建一个科学计算器,我有一组线性函数,用户可以向其中添加条目。我需要预解析一个数学表达式,以检查这些函数以及其他数学函数的使用情况,跟踪函数的名称和
(…)
中的内容,并用它们的计算结果替换它们

以这个表达式为例:

Ans1+(x*2)-(y^3)+abs(z)-avg(x, 5, Ans2)-my2ndFunc(y - (x * 2))
我写了我自己的正则表达式,我需要在等式中匹配这些:

abs(z)
avg(x,5,Ans2)
my2ndFunc(y-(x*2))

我使用测试了它,但它与任何项目都不匹配。这是我使用的正则表达式:

\b([a-z][a-z0-9]*)\((..*)\)\b
什么正则表达式将匹配这些函数并存储函数名和参数内容?另外,如果有人提供关于如何进行匹配和获取捕获组内容的示例代码,这也会很酷,但这不是必需的

编辑
我不需要实际的数学解析器,我有一个实现调车场算法的解析器。我只需要做一个简单的搜索和替换,数学解析器负责实际的数学,我只需要正则表达式来找到要计算的部分

我只需要一个匹配的简单正则表达式:
myfuncname(此处的任何内容)

我写了我自己的正则表达式

恐怕你用正则表达式走不了多远。一位智者曾经说过:

有些人在遇到问题时会想

我知道,我会用正则表达式

现在他们有两个问题

取而代之的是结帐。如果您想了解更多有关解析表达式所涉及的内容,可以签出

如果您想自己实现它,请签出


更新:

对不起,我没有仔细阅读你的问题。您正在寻找一个只解析输入的正则表达式,如

abs(z) 
avg(x, 5, Ans2) 
my2ndFunc(y - (x * 2))
您可以使用以下选项:

([a-z][a-z0-9]*)\((.+)\)

虽然使用C#中的正则表达式可以做到这一点(尽管不常见、困难且不可移植),但我建议不要这样做,而是使用一个简单的解析器。这是因为数学表达式不能始终符合正则语言。例如,如果一个函数被嵌套为另一个函数的输入,该怎么办?这是一位最近用C#编写了一个科学计算器应用程序的人写的。相信我。使用解析器将使其非常易于维护。@TylerCrompton我以前做过这件事,我使用muParser引擎处理数学方程解析,并在类中编写了处理函数。对于嵌套函数,我只是简单地使预解析函数递归。但是我不再有它的项目文件,我忘记了我使用的正则表达式。当你有像abs(avg(x,5,Ans2))这样的嵌套时会发生什么?@Rich我使预解析函数递归。原始正则表达式匹配不关心函数括号内的内容,但在匹配后,它会检查函数括号内的捕获组,以查看它是否是嵌套在函数内的函数,如果是,它会将该字符串传递给对其求值的预解析函数,将结果返回给顶级函数,然后用其结果替换函数调用,然后对顶级函数求值。我以前做过,只是记不起要匹配的正则表达式:
myfunc(这里的任何内容)
正如我的其他评论所示,我并不是说应该使用正则表达式,但平心而论,使用正则表达式有非常好的场景。例如,在词法分析器中使用正则表达式将文本分解为标记是完全可以接受的。我不需要实际的数学解析器,我有实现分流码算法的muParser。我只需要做一个简单的搜索和替换,数学解析器处理实际的数学,我只需要正则表达式来找到要计算的部分。即使我想自己创建实际的解析器,调车场算法对我的函数解析情况也没有任何帮助,因为它只解析由数字和运算符组成的数学方程。我只需要一个简单的正则表达式来匹配
myfunc(这里的任何内容)
@BrandonMiller,对不起,我没有仔细阅读您的问题。我已经用一个示例正则表达式更新了我的答案,您可以使用它来解析所需的输入。