我不知道如何在C#中做到这一点,但理论上是的,它可以做到。
您需要将您的正则表达式转换为NFA或DFA图形,横向使用BFS跟踪当前路径,为每条边添加一个新字符,并在完成节点时打印当前路径被击中。根据手头的正则表达式,您的内存使用情况可以轻松呈指数增长。
例如,给定的正则表达式(a|b)*abb
我们可以创建一个NFA图表如下所示:
这NFA图形既可以采用识别一个单词,枚举所有可能的单词。我们通过非确定性遍历图来做到这一点。意思是,我们需要跟踪图表中所有可能的路径。
从零开始,我们做一个BFS,并且对于每个有两个或更多输出边的节点,我们创建一个新的非确定性路径。所述BFS访问该节点按照下面的顺序,每次打印:
0, 1, 7, 2, 4, 8, 3, 5, 9, 6, 6, 10, 1, 1, 7, ...
对于每个节点访问我们有中间临时路径为:
- 0 “”
- 1中,“E “
- 7, ”E“
- 2, ”EE“
- 4, ”EE“
- 8,” E一个”
- 3, “EEA”
- 5中, “EEB”
- 9中, “EAB”
- 6中, “eeae”
- 6中, “eebe”
- 10 “eabb”
- 1 “eeaee”
- 1 “eebee”
在 “E” 符号是表示空字符串0123的ε-信,应在打印每个单词时将其过滤掉。
通过在图上做一个BFS,我们将每个单词按照需要用NFA识别单词的边的数量进行排序。由于图形包含一个循环,因此该过程永远不会结束。
每一次每一个不确定的路径到达我们打印生成的字符串结束节点10:
来源
2015-01-27 10:17:38
vz0
寻找解决[停止问题](http://en.wikipedia.org/wiki/Halting_problem)? – Oded 2012-03-02 15:09:11
正则表达式不完整。编辑:一般的正则表达式并不完整。如果C#允许你编写完整的图灵,那么是的,这是一个问题,这些功能将不得不被禁止。 – zmccord 2012-03-02 15:16:00
哦,我看到这也是一个部分愚弄http://stackoverflow.com/questions/4208733/generative-regular-expressionions – zmccord 2012-03-02 15:19:52