我正在尝试使用正则表达式来查找单词中的所有子字符串。它找到了一些但并非全部。在这样的例子中,'香蕉'这个词就是'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}/)}
答案 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
。