0

假设我有一个字符串“abacabacabadcdcdcd”,我想应用一组简单的规则:

蕉麻->a

dcd->d

从左到右,字符串最终是“abad”。此输出将用于做出决定。应用规则后,如果输出字符串与“abad”等预设字符串不匹配,则丢弃原始字符串。前任。每个字符串都应该蒸馏到“abad”,如果没有,就踢。

我现在将这个硬编码为正则表达式,但是这些小规则集有很多实例。我正在寻找可以采用一组简单规则并将其编译(或只是一个函数?)的东西,我可以将字符串输入并检索结果。规则集彼此独立。

输入受到严格控制,使用的规则也很简单。速度是最重要的方面。

我看过 Bison 和 ANTLR,但我认为我不需要任何强大的东西......

我在找什么?

编辑:应该提到字符串由几个字母组成。通常为 5,即“abcde”。没有空格等。只有字母。

4

1 回答 1

1

如果要快速运行,您可以从一个映射开始,其中包含您的规则作为字符串的键值对。然后,您可以将此映射编译为一种状态机,即具有 char 键的树,其中关联的值是替换字符串或另一棵树。

然后,您逐个字符地遍历您的字符串。在树中查找当前字符。如果您找到另一棵树,请查找该树中的下一个字符,依此类推。在某些时候,可以:

  1. 查找将失败,然后您知道到目前为止您看到的字符串不是任何规则的前缀。您可以跳过当前字符并继续下一个字符。
  2. 或者你得到一个替换字符串。在这种情况下,您可以用替换字符串替换当前字符和您查找的最后一个字符之间的字符。

唯一的困难是替换本身是否可以成为替换模式的一部分。例子:

ab -> e
cd -> b

输入:

acd -> ab (by rule 2)
ab   -> e (by rule 1) ????

现在的问题是,如果你想重新考虑 ab 给 e?

如果是这样,您必须在每次更换后从头开始。此外,很难判断替换是否结束,除非您拥有的所有规则都使得右手边比左手边短。因为在这种情况下,有限的字符串将在有限的时间内减少。

但是如果我们不需要重新考虑,上面的算法会直接遍历字符串。

于 2013-03-12T22:04:01.070 回答