【问题标题】:Ruby Pattern Matching- Finding number of all possible matchesRuby 模式匹配 - 查找所有可能匹配项的数量
【发布时间】:2012-08-04 20:21:13
【问题描述】:

有谁知道如何找到某个正则表达式模式的所有可能匹配项的数量?我的意思是这样的:

Calculator_1_([0-1]) 返回 2 个可能的结果,因为它可以匹配两个不同的输入:

 -Calculator_1_0
 -Calculator_1_1

Calculator_1_([0-2]) 返回 3 个可能的结果,因为它可以匹配三个不同的输入:

 -Calculator_1_0
 -Calculator_1_1
 -Calculator_1_2

Calculator_1_(.*) 返回无限,因为它可以匹配无限输入:

 -Calculator_1_0
 -Calculator_1_1
 -Calculator_1_2
 -Calculator_1_3
 -Calculator_1_a
 ...

编辑:顺便说一句,这只是一个例子。

【问题讨论】:

  • 在一般情况下,结果将是无限的,所以我不相信有一些开箱即用的功能可以应用。你想用这个来达到什么目的?你能提供一些背景吗?
  • 嗯,这是一个非常复杂的程序,但基本上我需要计算机能够从一系列用户生成的正则表达式模式中选择最佳模式。不过,为了做到这一点,我需要知道哪些模式可能匹配的数量最少,因此哪些是最精确的。在我上面的示例中,第一个和第二个模式都将匹配“Calculator_1_0”,但第一个更精确,因为它的匹配量最少。把它想象成一个正则表达式工具。
  • 我认为即使是非常微不足道的示例的可能组合也非常复杂,以至于您无法使用简单的算法来预测...
  • +1 表示一个非常有趣的问题,即使(在我看来)该问题本身没有好的解决方案。
  • 如果没有目标数据,您无法确定正则表达式将匹配什么。如果数据足够随机或变化多端,那么看似事先有无限命中的数据可能只有一个,反之亦然。对于您的问题,数据和模式耦合太紧密,无法同时回答。

标签: ruby regex pattern-matching


【解决方案1】:

在任何 Ruby 库(据我所知)中都不存在这样的功能。要正确执行此操作,您需要parse the regular expression into pieces,以便能够正确区分(例如):

 /1+/   # Infinite possibilities
 /1\+/  # 1 possibility
 /1\\+/ # Infinite possibilities
 /[1+]/ # 1 possibility

一旦完成,对于任何具有*+{n,} 限定符的正则表达式尽早退出将是一项相对“简单”的工作,转换所有(相关)? 和@987654327 @ 限定符为精确计数,将所有 […] 字符类转换为数字集,并在 a|b 交替和 (a?b){2,3} 分组表达式中扩展(乘)结果。

然而,鉴于目前无法轻松正确地解析正则表达式,这个概念已经死了。我担心,你的想法也是如此。是时候寻找另一种方法来解决您的问题了。

例如,对所有正则表达式使用线程以及scan 的块形式来并行处理匹配,停止和中止所有最早完成的进一步扫描?

【讨论】:

  • 嗯,问题是我正在针对用户生成的字符串运行一系列用户生成的模式,我需要找到哪个模式“最匹配”它。我确实知道这是可能的,因为任何基于逻辑的代码(如正则表达式)都可以分解为基本数学,然后您可以从那里计算所有可能的结果。但是,这并没有降低它的复杂性。
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 2015-10-01
  • 2016-05-31
  • 2017-07-19
  • 2021-10-17
相关资源
最近更新 更多