C# 用自定义解析器替换简单正则表达式的好方法是什么?

C# 用自定义解析器替换简单正则表达式的好方法是什么?,c#,regex,parsing,C#,Regex,Parsing,我正在用C#编写一个数据处理程序,在做了一些分析之后,我发现我使用的正则表达式是最大的瓶颈。它们占据了整个算法80%的时间,这不仅仅是解析,所以我决定手动解析数据 格式相当简单,我基本上是以=XXX+YYY的形式解析简单的算术表达式,其中XXX和YYY是术语,+表示可以应用于这些术语的有限运算符集之一。始终只有两个术语和一个运算符,尽管这些术语可以用几种不同的方式表示 到目前为止,我的方法基本上是编写一个类似于(matchXXX)([+-*/…])(matchyy)的regexp,然后在每个操作

我正在用C#编写一个数据处理程序,在做了一些分析之后,我发现我使用的正则表达式是最大的瓶颈。它们占据了整个算法80%的时间,这不仅仅是解析,所以我决定手动解析数据

格式相当简单,我基本上是以
=XXX+YYY
的形式解析简单的算术表达式,其中
XXX
YYY
是术语,
+
表示可以应用于这些术语的有限运算符集之一。始终只有两个术语和一个运算符,尽管这些术语可以用几种不同的方式表示

到目前为止,我的方法基本上是编写一个类似于
(matchXXX)([+-*/…])(matchyy)
的regexp,然后在每个操作数上应用另一个regexp,以查看它们是什么类型。我在编写高性能解析器方面没有太多经验。我只在Haskell中使用过Parsec,这是一种非常独特的方法,可能需要做很多工作才能实现

那么问题是,为这种表达式编写解析器的好方法是什么?是否有一种通用方法在大多数情况下都适用?

我不是在找解析器生成器。我需要的是一个可以手动实现的简单解决方案


更新:当前最慢的regexp是
([A-Z]+\d+([+\-*/])([A-Z]+\d+

我要尝试的第一条攻击线是优化正则表达式本身。由于表达式的结构缺少嵌套,因此可能存在一个简单的优化,可以显著减少引擎所花费的时间

接下来我要尝试的是通过预编译表达式更好地使用正则表达式引擎,即使用非静态方法
regex
,而不是静态方法


在这两种方法都不起作用的情况下,我会选择一种简单的方法。这些解析器是迄今为止最简单的代码编写工具,但它们对于简单语言的性能很好(而且您的语言非常简单)。

您是否使用了反向引用?如果不是--很好,您可以通过使用更快的正则表达式引擎来优化它。在这里阅读更多优秀文章:

由于您最复杂的正则表达式没有使用它,我希望其他正则表达式也是如此。下一步——你是否提前知道你的正则表达式,或者它们是作为输入的?如果是前者,则预编译它们


我自己编写了multi-regex引擎(我的一部分),但它仍然有点新鲜——不管怎么说,它展示了这个想法,使用所有正则表达式,编译它们,构建一个转换表,并针对输入运行它。由于表中有所有正则表达式的转换,因此没有时间考虑这个或那个。在用我的MRE替换.Net正则表达式之后,我得到了x2加速(我说了,它是新的:-D)。

为什么不使用
String.Split
方法,将有限的字符集作为分隔符传递?如果正则表达式不太复杂,可以显示它吗?正则表达式可能会变慢,但在优化时也会变快。另外,不要忘记使用
RegexOptions.Compiled
。发布您的正则表达式,以便我们查看它是否有问题。@Dmitry如果有办法查看拆分发生在哪个字符上,我可以这样做,但看看API,它似乎不是一个选项。如果您也需要运算符的
字符
,请尝试使用
字符串.IndexOfAny
字符串.Substring