Ruby 如何将字符串汇总到shell glob中
是否有任何Ruby习惯用法或流行的库用于将字符串整合到shell glob中以生成它们?例如,给定字符串Ruby 如何将字符串汇总到shell glob中,ruby,text,Ruby,Text,是否有任何Ruby习惯用法或流行的库用于将字符串整合到shell glob中以生成它们?例如,给定字符串 abc1 abc2 abc3 我想生成字符串abc{1..3}或abc{1,2,3}。这很像在IP寻址中总结子网 我想Rubyesque方法可能涉及到对字符串进行排序,然后构建一个组成字符的数组,将不重叠的字符递归地放入嵌套数组中。但是,如果已经有了某种东西,我宁愿不要重新发明轮子。我借用了公认的解决方案,并使用了递归算法: def longest_common_substr(string
abc1
abc2
abc3
我想生成字符串abc{1..3}
或abc{1,2,3}
。这很像在IP寻址中总结子网
我想Rubyesque方法可能涉及到对字符串进行排序,然后构建一个组成字符的数组,将不重叠的字符递归地放入嵌套数组中。但是,如果已经有了某种东西,我宁愿不要重新发明轮子。我借用了公认的解决方案,并使用了递归算法:
def longest_common_substr(strings)
shortest = strings.min_by &:length
maxlen = shortest.length
maxlen.downto(0) do |len|
0.upto(maxlen - len) do |start|
substr = shortest[start,len]
return substr if strings.all?{|str| str.include? substr }
end
end
end
def create_glob(files)
return '' if files.compact.empty?
stub=longest_common_substr(files)
if stub.length == 0
expansion = files.uniq.join(',')
return '' if expansion == ''
return '{' + expansion + '}'
end
pre = []
post = []
files.each do |file|
i = file.index(stub)
pre << file[0, i]
post << file[i+stub.length..-1]
end
return create_glob(pre) + stub + create_glob(post)
end
它还涵盖了更复杂的情况,如可变前缀:
puts create_glob(['first.abc1',
'second.abc2',
'third.abc3'
])
#=> {first,second,third}.abc{1,2,3}
甚至缺少值:
puts create_glob(['.abc1',
'abc',
'abc3'
])
#=> {.,}abc{1,,3}
请注意,可能会生成非文件的字符串。例如,最后一个示例如下展开:
$ echo {.,}abc{1,,3}
.abc1 .abc .abc3 abc1 abc abc3
因此,使用输出时必须稍微小心一点。这听起来像是X/Y问题。你想用这种方法解决的实际问题是什么?我问的X/Y问题是什么很抱歉让你失望,但这里没有诡计——这确实是我想做的!我正在编写一些ERB模板来标准化问题措辞,并希望总结相关项目组(如集群成员),以便于人类阅读。我并不是想用管子吹到炮弹或类似的东西上。这个措辞是针对技术受众的,在第一个
角色
集群中,role01{a..c}
将是我们引用服务器a到c的最友好的方式。您好,看起来您需要找到最长的公共子字符串,然后合并剩余的块
$ echo {.,}abc{1,,3}
.abc1 .abc .abc3 abc1 abc abc3