C# 我应该如何重构这个正则表达式反转算法以允许重复字符类?

C# 我应该如何重构这个正则表达式反转算法以允许重复字符类?,c#,algorithm,C#,Algorithm,我编写此代码是为了生成一个正则表达式将匹配的字符串。工作非常好,但它仍然缺少一些功能 例如,当反转\d{3}时,它首先选择一个数字,然后重复相同的数字3次。我想选择3个不同的数字 我认为解决这个问题最简单的方法是将\d推到令牌列表上,并在量词之后而不是之前对其求值 这一切都很好,但如何解析像(a(b)){2}|(c)\3这样的东西呢。假设我遵循“以后评估”策略,这将标记为“(a(b)),(a(b))或(c),\3”。这实际上导致了一些问题。我不能把(a(b))当作一个整体来重复它,实际上我必须在

我编写此代码是为了生成一个正则表达式将匹配的字符串。工作非常好,但它仍然缺少一些功能

例如,当反转
\d{3}
时,它首先选择一个数字,然后重复相同的数字3次。我想选择3个不同的数字

我认为解决这个问题最简单的方法是将
\d
推到令牌列表上,并在量词之后而不是之前对其求值

这一切都很好,但如何解析像
(a(b)){2}|(c)\3
这样的东西呢。假设我遵循“以后评估”策略,这将标记为“
(a(b))
(a(b))
(c)
\3
”。这实际上导致了一些问题。我不能把
(a(b))
当作一个整体来重复它,实际上我必须在
\3
之前的某个时候对它进行评估,这样我才能计算出编号的引用(
ab
\1
b
\2
,而
c
\3

另一个问题是,如果我真的像那样重复字符串,
(a(b))
(a(b))
两次。。。然后当我去给它编号时,它将被重复计算,因为我丢失了量词信息。除非我没有保存字符串列表,而是保存一个更复杂的结构,表明它是否被计数。否则我会马上把它填到后面的参考列表中。。。但是如果我把它放在unevaluated中,它需要被评估两次,这是行不通的,所以我必须在把它放进后面的参考列表之前对它进行评估

但是如果我有类似于
(a | b){2}\1
?I
\1
指的是最后一次捕获。所以我不能立即评估
(a | b)
,然后将结果扔到后面的参考列表中,因为它可能被量化。。。我或许可以在量化后立即对其进行评估


我想这一切都会对我有所帮助。但我仍然不知道如何考虑量词。。。我只是想在找到量词后立即复制节点,但我不确定这是否是最好的方法。也许如果我在节点上添加repeat min,repeat max变量?

我认为正则表达式的功能已经到了极限。我认为您需要做的是经典解析,从输入字符串生成解析树,然后在树分析步骤中执行您在文章中提到的分析类型。

我认为正则表达式的功能已经达到极限。我认为您需要做的是经典解析,从输入字符串生成解析树,然后在树分析步骤中执行您在帖子中提到的分析类型。

所以您同意我需要一个树结构。。。好啊我将对此进行一点讨论,看看我能想出什么。所以你同意我需要一个树结构。。。好啊我将在这里玩一会儿,看看我能想出什么。