正则表达式忽略一些字母

时间:2018-07-29 14:57:08

标签: ruby regex regex-group

我正在尝试解决Chasing Subs problem。我正在尝试根据输入数据生成该正则表达式。目标是获取所有带有唯一字母的子字符串(包括重叠的子字符串)。

我正在尝试像这样使用regexp:

regexp = /(?=(?<gs>.)(?<gu>[^\k<gs>])(?<gb>[^\k<gs>\k<gu>])(?<gm>[^\k<gs>\k<gu>\k<gb>])(?<ga>[^\k<gs>\k<gu>\k<gb>\k<gm>])(?<gr>[^\k<gs>\k<gu>\k<gb>\k<gm>\k<ga>])(?<gi>[^\k<gs>\k<gu>\k<gb>\k<gm>\k<ga>\k<gr>])(?<gn>[^\k<gs>\k<gu>\k<gb>\k<gm>\k<ga>\k<gr>\k<gi>])(?<ge>[^\k<gs>\k<gu>\k<gb>\k<gm>\k<ga>\k<gr>\k<gi>\k<gn>]))/
"archipelago".scan(regexp) #=> []
"archipelbgo".scan(regexp) #=> []
"brchipelbgo".scan(regexp) #=> []
"zrchipelzgo".scan(regexp) #=> [["z", "r", "c", "h", "i", "p", "e", "l", "z"]] 

为什么会这样?为什么用"b""a"找不到任何东西?为什么用"z"只返回一个(不正确的)结果?我在做什么错了?

1 个答案:

答案 0 :(得分:1)

我认为正则表达式不是解决此问题的正确工具。但是,我们可以执行以下操作。

def substrings(str)
  arr = str.chars
  (1..str.size).each_with_object([]) { |n,a|
    arr.each_cons(n) { |b| a << b.join if b == b.uniq } }
end

substrings("archipelago")
  #=> ["a", "r", "c", "h", "i", "p", "e", "l", "a", "g", "o", "ar", "rc", "ch", "hi",
  #    "ip", "pe", "el", "la", "ag", "go", "arc", "rch", "chi", "hip", "ipe", "pel",
  #    "ela", "lag", "ago", "arch", "rchi", "chip", "hipe", "ipel", "pela", "elag",
  #    "lago", "archi", "rchip", "chipe", "hipel", "ipela", "pelag", "elago", "archip",
  #    "rchipe", "chipel", "hipela", "ipelag", "pelago", "archipe", "rchipel", "chipela",
  #    "hipelag", "ipelago", "archipel", "rchipela", "chipelag", "hipelago", "rchipelag",
  #    "chipelago", "rchipelago"]