Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式:语言生成器_C#_Regex - Fatal编程技术网

C# 正则表达式:语言生成器

C# 正则表达式:语言生成器,c#,regex,C#,Regex,给定C#中的正则表达式,是否有方法生成该正则表达式接受的单词 例如,让我们考虑一下: [ab]c*b* 是否有一个函数可以自动生成枚举,如: a b ac ab bc bb acb bcb acc bcc ... 显然,这个列表是无限的,只要你想要单词,生成器就必须是智能的,以便输出从最简单到最复杂的内容,而不会陷入无限循环中 我认为这将是验证正则表达式的有用工具。一般来说,很容易看出正则表达式接受您计划它将接受的单词。通常很难看出它会接受其他词 编辑:这个问题不是关于如何做,而是:有什么东

给定C#中的正则表达式,是否有方法生成该正则表达式接受的单词

例如,让我们考虑一下:

[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”
“e”符号是表示空字符串
”的ε字母,在打印每个单词时应将其过滤掉

通过对图形进行BFS,我们将根据需要的边数对每个单词进行排序,以便再次使用NFA识别单词。因为图形包含一个循环,所以此过程永远不会结束

每次每个不确定路径到达结束节点10时,我们打印生成的字符串:

  • “abb”
  • “aabb”
  • “巴布”

想解决这个问题吗?正则表达式不是图灵完备的。编辑:正则表达式通常不是图灵完备的。如果C#允许你编写图灵完备的正则表达式,那么是的,这是一个问题,这些特性必须被禁止。哦,我看到这也是@Oded的部分重复:不,这是关于专业环境的,我正在构建一个a可以由正则表达式解析的小型语言驱动的应用程序。我想检查我是否接受过多的单词,并且我想使用这样的生成器来创建测试。@Oded:你能解释一下为什么你认为这与停止问题有关吗?这是一个基本练习,需要使用离散有限自动机和find从开始状态到目标状态的路径(如果存在的话)(这当然假设正则表达式实际上是正则的。如果它是那些所谓的“正则”表达式之一,实际上需要一个下推自动机,那么这就变得更难了。)您可以将正则表达式转换为有限状态自动机,然后用某种启发式方法探索图形