【问题标题】:Producing all possible matches of a regular expression生成正则表达式的所有可能匹配项
【发布时间】:2011-10-02 09:23:51
【问题描述】:

给定一个正则表达式,我想生成该正则表达式匹配的字符串集。重要的是要注意这个集合不会是无限的,因为每个字符串都有最大长度。是否有任何众所周知的算法可以做到这一点?有没有我可以阅读的研究论文来深入了解这个问题?

谢谢。

附言这种问题在理论上的cs堆栈交换中会更合适吗?

【问题讨论】:

  • 好吧,我们不能投票支持转向理论 CS,所以你可以标记你的问题并提出一个 mod。
  • 所有可能的字符串对应于通过状态机并最终匹配的所有可能路径。但这就像在问,给我所有与我的程序输出相匹配的有限长度的可能程序。
  • 当您说每个字符串的“最大长度”时,您的意思是您的正则表达式不包含任何 + 或 * 运算符?
  • 你为什么要这样做?
  • @Ray Toal:正则表达式可以包含 + 或 *,但最大字符串长度将确保没有无限可能。我说得通吗?

标签: regex string algorithm production


【解决方案1】:

是否有任何众所周知的算法可以做到这一点?

在 Perl 生态系统中,Regexp::Genex CPAN 模块执行此操作。

在 Python 中,sre_yield 生成匹配的单词。 Regex inverter 也这样做。

这里描述了一种递归算法link1link2,在 Java 中执行此操作的几个库是mentioned here

生成匹配给定正则表达式的随机单词/字符串:xeger (Python)

有没有我可以阅读的研究论文来深入了解这个问题?

是的,以下论文可用于计算与正则表达式匹配的字符串(或获取它们的生成函数):

  1. 计算一组有限单词的出现次数:一种包含-排除方法,作者 F. Bassino、J. Clement2、J. Fayolle 和 P. Nicodeme (2007) paper slides
  2. Regexpcount,一个用于计算正则表达式和单词问题的符号包,作者 Pierre Nicodeme (2003) paper link link code

【讨论】:

  • 谢谢。我可以继续使用该模块。您是否知道任何讨论如何实现这样一个模块的资源?我很好奇如何优雅/高效地实现它。
  • 只检查它的源代码。直观地说,正则表达式是一个自动机,所以是一个图形。生成与字符串匹配的所有字符串意味着查找从自动机的“开始”节点开始并以“接受”节点结束的所有路径,因此它仅表示图中路径的枚举。
猜你喜欢
  • 2015-05-05
  • 1970-01-01
  • 2021-06-11
  • 2013-01-25
  • 1970-01-01
  • 2011-02-23
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多