我写了this algorithm来生成正则表达式匹配的字符串。效果很好,但它仍然缺少一些功能。
例如,当反转\d{3}
时,它首先选择一个数字,然后重复相同的数字3次。我想选择3个不同的数字。
我认为解决此问题的最简单方法是将\d
推送到令牌列表并在量词后评估,而不是之前。
这一切都很好,但是解析像(a(b)){2}|(c)\3
这样的东西呢。假设我正在遵循“稍后评估”策略,则会将其标记为“(a(b))
,(a(b))
或(c)
,\3
”。这实际上导致了一些问题。我不能只将(a(b))
视为一个整体并重复它,我实际上必须在\3
之前的某个时间进行评估,以便我可以计算编号的引用(ab
是{{1 },\1
为b
,\2
为c
)。
另一个问题是,如果我实际重复这样的字符串,\3
,(a(b))
两次......那么当我去编号时,它会被重复计算,因为我已经丢失了量词信息。除非我没有保留一个字符串列表,而是一个更复杂的结构,表明它是否被计数。那,或者我把它直接填入后面的参考列表......但是如果我把它放在未评估的位置,它将需要被评估两次,这将无法工作,所以我必须在将它放入之前进行评估反向引用列表......
但是如果我有类似(a(b))
的话?我think (a|b){2}\1
指的是 last 捕获。所以我无法立即评估\1
,然后将结果抛出到后面引用列表中,因为它可能是量化的...我可以在量化后立即对其进行评估。
我在想a different structure会帮助我解决所有这些问题。但我仍然不知道如何考虑量词......我只是在找到量词时立即复制节点,但我不确定这是否是最好的方法。也许如果我在节点上添加repeat-min,repeat-max变量?
答案 0 :(得分:1)
我认为你正处于正则表达式的极限。我认为您需要做的是经典解析,从输入字符串生成解析树,然后在树分析步骤中执行您在帖子中讨论的分析类型。