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

时间:2010-12-07 22:37:10

标签: c# algorithm

我写了this algorithm来生成正则表达式匹配的字符串。效果很好,但它仍然缺少一些功能。

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

我认为解决此问题的最简单方法是将\d推送到令牌列表并在量词后评估,而不是之前。

这一切都很好,但是解析像(a(b)){2}|(c)\3这样的东西呢。假设我正在遵循“稍后评估”策略,则会将其标记为“(a(b))(a(b))(c)\3”。这实际上导致了一些问题。我不能只将(a(b))视为一个整体并重复它,我实际上必须在\3之前的某个时间进行评估,以便我可以计算编号的引用(ab是{{1 },\1b\2c)。

另一个问题是,如果我实际重复这样的字符串,\3(a(b))两次......那么当我去编号时,它会被重复计算,因为我已经丢失了量词信息。除非我没有保留一个字符串列表,而是一个更复杂的结构,表明它是否被计数。那,或者我把它直接填入后面的参考列表......但是如果我把它放在未评估的位置,它将需要被评估两次,这将无法工作,所以我必须在将它放入之前进行评估反向引用列表......

但是如果我有类似(a(b))的话?我think (a|b){2}\1指的是 last 捕获。所以我无法立即评估\1,然后将结果抛出到后面引用列表中,因为它可能是量化的...我可以在量化后立即对其进行评估。

我在想a different structure会帮助我解决所有这些问题。但我仍然不知道如何考虑量词......我只是在找到量词时立即复制节点,但我不确定这是否是最好的方法。也许如果我在节点上添加repeat-min,repeat-max变量?

1 个答案:

答案 0 :(得分:1)

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