说我有一个字符串“abacabacabadcdcdcd”,我想应用一套简单的规则:
abaca->一种
dcd-> d
从左到右s.t.字符串最终成为“abad”。此输出将用于做出决定。应用规则后,如果输出字符串与预设字符串(如“abad”)不匹配,则原始字符串将被丢弃。恩。每个字符串应该提取到“abad”,如果没有,则踢。
我现在将此硬编码作为正则表达式,但这些小规则集有很多实例。我正在寻找一些将采取一系列简单规则并编译(或只是一个函数?)的东西,我可以将字符串提供给并检索结果。规则集彼此独立。
输入受到严格控制,使用的规则很简单。速度是最重要的方面。
我看过Bison和ANTLR,但我认为我不需要那么强大......
我在找什么?
编辑:应该提到字符串由几个字母组成。通常为5,即“abcde”。没有空格等等。只是字母。
答案 0 :(得分:1)
如果速度很快,你可以从一张地图开始,它包含你的规则作为字符串的键值对。然后,您可以将此映射编译为一种状态机,一个带有char键的树,其中关联的值是替换字符串或另一个树。
然后你通过字符串char来char。查找树中的当前字符。如果找到另一棵树,请查找该树中的下一个字符,等等。 在某些时候,要么:
唯一的困难是如果替换本身可以成为替换模式的一部分。例如:
ab -> e
cd -> b
输入:
acd -> ab (by rule 2)
ab -> e (by rule 1) ????
现在问题是你是否想重新考虑ab给e?
如果是这样,您必须在每次更换后从头开始重新开始。此外,很难判断替换是否会结束,除非您拥有的所有规则都是右侧比左侧短。因为,在这种情况下,有限的字符串将在有限的时间内减少。
但如果我们不需要重新考虑,上面的算法将直接通过字符串。