【发布时间】:2013-04-29 02:13:48
【问题描述】:
我遇到了 ruby 正则表达式的问题。我需要找到所有(可能重叠的)匹配项。这是问题的简化:
#Simple example
"Hey".scan(/../)
=> ["He"]
#Actual results
#With overlapping matches the result should be
=> ["He"], ["ey"]
我尝试执行并获得所有结果的正则表达式如下所示:
"aaaaaa".scan(/^(..+)\1+$/) #This looks for multiples of (here) "a" bigger than one that "fills" the entire string. "aa"*3 => true, "aaa"*2 => true. "aaaa"*1,5 => false.
=> [["aaa"]]
#With overlapping results this should be
=> [["aa"],["aaa"]]
是否有库或方法可以在 ruby 中执行正则表达式以获得我想要的结果?
我发现了一些线索表明这在 Perl 中是可能的,但经过数小时的研究后,我没有发现任何关于 Ruby 方法的信息。
但是我能够找到这个“Javascript Regex - Find all possible matches, even in already captured matches”,但是我找不到任何与 Ruby 类似的东西,也找不到与 Ruby 版本中最后一个索引属性类似的东西。老实说,我认为它无论如何都不会起作用,因为我打算使用的正则表达式是递归的并且依赖于整个字符串,而该方法会切掉字符串。
【问题讨论】:
-
所以基本上你想要一个字符串的排列?
-
没有。这只是一个例子。实际的正则表达式有点难,但这是出现的问题。 scan 方法会切断它找到的字符串部分并继续。我需要它来保留字符串,以便下一个可能的匹配项可以查看它。
-
我不确定,但第一个和第二个例子有点矛盾。按照第一个例子,我认为第二个应该返回
[aa, aa, aa, aa, aa...., aaa, aaa, aaa ..., aaaa, aaaa, aaaa ...., aaaaa, aaaaa, aaaaaa] -
没有。那不是那个正则表达式寻找的东西。答案应该是
aa, aaa。这些是唯一可能的匹配项。 -
Perl 可以做到这一点,但它可以非常迅速地爆炸。我需要类似的东西并放弃了。