Ruby 有没有一种方法可以找到字符串最具体的模式?

Ruby 有没有一种方法可以找到字符串最具体的模式?,ruby,regex,Ruby,Regex,我想知道是否有一种方法可以生成与给定字符串匹配的最特定的正则表达式(如果存在这样的东西)。下面是我希望该方法执行的操作的示例: str = "(17 + 31)" find_pattern(str) # => /^\(\d+ \+ \d+\)$/ (or something more specific) 我的直觉是使用Regex.new通过循环str并检查诸如\d、\s等已知模式来累积所需的模式。我怀疑有一种简单的方法可以做到这一点。这本质上是一个算法压缩问题。匹配已知字符串列表的最简单

我想知道是否有一种方法可以生成与给定字符串匹配的最特定的正则表达式(如果存在这样的东西)。下面是我希望该方法执行的操作的示例:

str = "(17 + 31)"
find_pattern(str)
# => /^\(\d+ \+ \d+\)$/ (or something more specific)

我的直觉是使用
Regex.new
通过循环
str
并检查诸如
\d
\s
等已知模式来累积所需的模式。我怀疑有一种简单的方法可以做到这一点。

这本质上是一个算法压缩问题。匹配已知字符串列表的最简单方法是使用
Regexp.union
factory方法,但这只是依次尝试每个字符串,它不会做任何“聪明”的事情:

这对于构造多级验证器仍然很有用,无需编写循环来检查它们

然而,一个能够从示例中找出要匹配的内容的通用模式匹配器实际上是不可能的。有很多方法可以考虑字符串相似或不相似。我能想到的最接近的是遗传编程,在这里,你提供了一个大列表,列出了应该匹配/不应该匹配的字符串,代码通过构造随机
Regexp
对象来猜测最佳正则表达式(这本身就是一个挑战),并查看它们与你的示例匹配和不匹配的准确程度。最好的匹配器可以组合、变异并再次尝试,直到获得100%的准确率。这可能是一个有趣的项目,但对于大多数目的来说,最终要比自己根据问题描述编写正则表达式付出更多的努力


如果您的问题受到严重限制-例如,任何示例整数始终可以替换为
\d+
,任何示例空格可以替换为
\s+
等,那么您可以通过字符串替换“可匹配的单位”,实际上是使用依次检查的相同正则表达式。例如,如果匹配
\A\d+
,则使用字符串中的匹配项,并将
\d+
添加到正则表达式中。然后取字符串的剩余部分并查找下一个匹配模式。以这种方式工作有其局限性(您必须事先知道要匹配的全套模式,并且所有示例都必须明确)。然而,它比基因程序更容易处理。

最具体的模式是字符串本身,您至少需要两个字符串来生成通用模式,恐怕这不会很容易。@Broisasze谢谢您;我也有这种恐惧。我将尝试在至少两个(不同的)字符串中找到共同的模式,而不是一个。
combined_rx = Regexp.union( "(17 + 31)", "(17 + 45)" )
 => /\(17\ \+\ 31\)|\(17\ \+\ 45\)/