Ruby扫描与正则表达式找不到所有模式

时间:2014-08-25 04:34:20

标签: ruby regex substring

我正在尝试使用正则表达式来查找单词中的所有子字符串。它找到了一些但并非全部。在这样的例子中,'香蕉'这个词就是'an'。

def substrings str
  pattern = '.'
  subs = []    
  while pattern.length < str.length do
    subs << str.scan(/#{pattern}/)
    pattern << '.'  
  end 
  subs.flatten  
end

puts substrings("banana").sort_by{ |s| "banana".index(/#{s}/)}

3 个答案:

答案 0 :(得分:3)

正则表达式匹配永远不会重叠。如果您要求/../,您将获得["ba", "na", "na"]。由于["ba", "an" ...]重叠"an",您将无法获得"ba"。下一场比赛搜索将始于最后一场比赛结束。

如果您想查找重叠序列,则需要使用lookahead / lookbehind缩短匹配大小,以使匹配本身不会重叠:/(?=(..))/。请注意,您必须引入一个捕获组,因为在这种情况下匹配本身是一个空字符串。

答案 1 :(得分:2)

def substrings str
  (0...str.length).flat_map{|i| (i...str.length).map{|j| str[i..j]}}.uniq
end

substrings("banana")

结果

[
  "b",
  "ba",
  "ban",
  "bana",
  "banan",
  "banana",
  "a",
  "an",
  "ana",
  "anan",
  "anana",
  "n",
  "na",
  "nan",
  "nana"
]

def substrings str
  (0...str.length).to_a.combination(2).map{|r| str[*r]}.uniq
end

结果

[
  "b",
  "ba",
  "ban",
  "bana",
  "banan",
  "banana",
  "an",
  "ana",
  "anan",
  "anana",
  "nan",
  "nana",
  "na",
  "a"
]

答案 2 :(得分:-1)

这是另一种不使用正则表达式的方法。我现在看到如何使用正则表达式,但我不知道你为什么要这样做,除非它只是一个练习。

def substrings(str)
  arr = str.chars
  (1..str.size).each_with_object([]) { |i,a|
    a << arr.each_cons(i).to_a.map(&:join) }.flatten
end

substrings("banana")
  #=> ["b", "a", "n", "a", "n", "a", "ba", "an", "na", "an", "na", "ban",
  #    "ana", "nan", "ana", "bana", "anan", "nana", "banan", "anana"]

如果您想要包含“香蕉”一词,请将str.size更改为str.size+1