【问题标题】:is there any way to get all the possible outcomes of a regular expression pattern?有没有办法获得正则表达式模式的所有可能结果?
【发布时间】:2023-03-24 03:19:01
【问题描述】:

有没有办法得到正则表达式模式的所有可能结果?我所看到的一切都指的是针对字符串评估的模式。但我需要的是有这样的模式:

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

生成所有可能的匹配:

EM1650S
EM1650SB
EM1650SBB
EM1650SL
EM1650SLL

【问题讨论】:

  • 您不会经常看到这种情况,因为绝大多数正则表达式模式往往具有无限多的可能结果。
  • 不是无限的。简直太棒了。
  • @Alfabravo - 我见过的许多(大多数?)RegEx 在某处有一个*,如果不是“0 或更多”,通常是“1 或更多”标记。这些标记通常会给你一个无限的列表,因为“或更多”==“无限”。
  • 听起来很难,大多数正则表达式可以匹配无数个字符串
  • 这是关于该主题的另一个线程:stackoverflow.com/questions/7614962/…

标签: javascript jquery regex


【解决方案1】:

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

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

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

【讨论】:

  • 我认为 OP 正在寻找一些指示如何获得结果,而不是如果可以做到......跨度>
  • 这是一个关于如何完成它的指示,这并不容易,我不希望任何人花时间为 OP 编写代码
  • 是的,尽管对于这些简单的正则表达式来说模拟 DFA 可能并不难。
  • 手动生成列表可能比编写代码来解析正则表达式并生成输出更容易。
  • @JuanMendes - 我的评论是在编辑之前。最初的答案只是第一段。
【解决方案2】:

一般情况下,不会。在这种情况下,您几乎没有解空间。

有一个section covering this in Higher Order Perl (PDF) 和一个Perl module。我从来没有在其他任何东西中重新实现它,但我遇到了类似的问题,这个解决方案足以满足同样有限的需求。

【讨论】:

    【解决方案3】:

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

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

    很遗憾,我找不到任何适用于 JavaScript 的内容

    【讨论】:

    • 有趣。 Regexp-Genex 将* 限制为{0,3}+{1,4},表面上是为了让它更漂亮,但这样做的副作用是消除了大多数正则表达式所具有的无限解空间。
    • 酷,genex 假设 *{0,3}+{1,4} 并且因此产生有限数量的排列。哇,这是我的第二条评论,我迟到了,最终成为别人评论的副本。
    • 是的,它并不完美。这是 Reddit 上关于此主题的讨论帖:reddit.com/r/programming/comments/hya57/…
    • 是的,谢谢,我会复习的,事实上我需要一个 javascript、asp、asp.net(c# 或 vb)或 php 的工具
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2010-10-12
      相关资源
      最近更新 更多