有没有任何方法可以得到正则表达式模式的所有可能结果

is there any way to get all the possible outcomes of a regular expression pattern?

本文关键字:模式 有可能 结果 正则表达式 方法 任何 有没有      更新时间:2023-09-26

有什么方法可以获得正则表达式模式的所有可能结果吗?。我看到的所有内容都引用了一个根据字符串进行评估的模式。但我需要的是有一个这样的模式:

^EM1650S(B{1,2}|L{1,2})?$

生成所有可能的匹配:

EM1650S
EM1650SB
EM1650SBB
EM1650SL
EM1650SLL

在一般情况下,没有。在这种情况下,您几乎没有解决方案空间。

在高阶Perl(PDF)和Perl模块中有一节介绍了这一点。我从未在其他任何事情中重新实施过它,但我也遇到了类似的问题,这种解决方案足以满足同样有限的需求。

有一些工具可以显示正则表达式的所有可能匹配项。

以下是用Haskell写的:https://github.com/audreyt/regex-genex这里是一个Perl模块:http://metacpan.org/pod/Regexp::Genex

不幸的是,我找不到任何关于JavaScript 的东西

在这种特殊情况下,是的。正则表达式生成有限数量的有效字符串,因此可以对其进行计数。

您只需要解析正则表达式。其中的某些部分(EM1650S)是强制性的,所以请考虑其余部分。通过|(或)符号进行解析。然后枚举它两边的字符串。然后你可以得到它们所有可能的组合。

某些正则表达式(包含*+符号)可以表示无限数量的字符串,因此无法对其进行计数。

从计算理论的角度来看,正则表达式等价于有限状态机。这是"自动机理论"的一部分。你可以创建一个等价于正则表达式的有限状态机,然后使用图遍历算法遍历FSM的所有路径。在一般情况下,可计数的无限数量的字符串可能与正则表达式匹配,因此您的程序可能永远不会根据输入的正则表达式而终止。