C# 正则表达式:语言生成器
给定C#中的正则表达式,是否有方法生成该正则表达式接受的单词 例如,让我们考虑一下:C# 正则表达式:语言生成器,c#,regex,C#,Regex,给定C#中的正则表达式,是否有方法生成该正则表达式接受的单词 例如,让我们考虑一下: [ab]c*b* 是否有一个函数可以自动生成枚举,如: a b ac ab bc bb acb bcb acc bcc ... 显然,这个列表是无限的,只要你想要单词,生成器就必须是智能的,以便输出从最简单到最复杂的内容,而不会陷入无限循环中 我认为这将是验证正则表达式的有用工具。一般来说,很容易看出正则表达式接受您计划它将接受的单词。通常很难看出它会接受其他词 编辑:这个问题不是关于如何做,而是:有什么东
[ab]c*b*
是否有一个函数可以自动生成枚举,如:
a
b
ac
ab
bc
bb
acb
bcb
acc
bcc
...
显然,这个列表是无限的,只要你想要单词,生成器就必须是智能的,以便输出从最简单到最复杂的内容,而不会陷入无限循环中
我认为这将是验证正则表达式的有用工具。一般来说,很容易看出正则表达式接受您计划它将接受的单词。通常很难看出它会接受其他词
编辑:这个问题不是关于如何做,而是:有什么东西我可以用C语言来做吗?这甚至不是一个C语言特有的问题;我想你可以用任何真正的正则表达式来做这件事
在我看来,你应该能够为任何正则表达式匹配讲述一代人的故事,这只是一个重写列表。在您的示例中,[ab]c*b*
可以生成acccbb
;这是[ab]c*b*
->ac*b*
->acccb*
->acccbb
。对于每个操作符,我们可以想象列举它重写的所有方式;然后,这只是一个枚举所有重写组合的问题,这归结为枚举所有自然的N元组
编辑:自然的N元组是一个油嘴滑舌的比较。但是你可以想象在重写状态上执行广度优先遍历,输出所有操作符都被重写掉的每个字符串。我不知道如何在C#中做到这一点,但理论上是可以做到的 您需要将正则表达式转换为NFA或DFA图,使用BFS跟踪当前路径,为每条边的路径添加新字符,并在到达完成节点时打印当前路径。根据手头的正则表达式,内存使用量很容易呈指数级增长 例如,给定正则表达式
(a | b)*abb
,我们可以创建如下NFA图:
(a | b)*abb“>
这个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,“ea”
- 3,“欧洲经济区”
- 5,“欧洲经济区”
- 9,“eab”
- 6,“欧洲经济区”
- 6,“eebe”
- 10,“eabb”
- 1,“eeaee”
- 1,“eebee”
“
”的ε字母,在打印每个单词时应将其过滤掉
通过对图形进行BFS,我们将根据需要的边数对每个单词进行排序,以便再次使用NFA识别单词。因为图形包含一个循环,所以此过程永远不会结束
每次每个不确定路径到达结束节点10时,我们打印生成的字符串:
- “abb”
- “aabb”
- “巴布”