我想编写一个脚本,它接受一个可能如下所示的参数:
abc(ag)de*
Run Code Online (Sandbox Code Playgroud)
a
,b
,c
是文字符号.
(ag)
意思是"一个'a'或'g'".
*
指任何一个字母或数字.
我希望脚本创建一个包含输入可能代表的所有可能字符串的数组.(目的是检查它们是否可用域名.)
输入也可以abc(ag)de(mnlop)
是比字符类更多的东西.
似乎第一个任务是将其拆分为数组或数组,所以第一个例子是......
[
['a'],
['b'],
['c'],
['a', 'g'],
['d'],
['e'],
[
'a', 'b', 'c', 'd', 'e', 'f', 'g',
# etc...
]
]
Run Code Online (Sandbox Code Playgroud)
这是我被卡住的地方.我不知道怎么把它分成这样的碎片.
有关如何处理它的任何建议?
这是一个非常紧凑的解决方案.它并没有针对性能进行优化,这会对您提供的模式施加一些限制,例如,太多的通配符可能不是最好的主意.
这是代码
input1 = "abc(ag)de*"
input2 = "abc(ag)de(mnlop)"
class Array
def append_suffixes!(suffixes)
self.replace suffixes.map { |a| self.map { |p| p + a }}.flatten
end
end
def generate_combinations(pattern)
combinations = [""]
pattern.scan(/\(([^)]+)\)|(\*)|(\w+)/) do |group,wildcard,other|
new_suffixes = case
when group : group.split('')
when wildcard : [*'a'..'z']
when other : other
else raise "Unknown match!"
end
combinations.append_suffixes! new_suffixes
end
combinations
end
p generate_combinations(input1)
p generate_combinations(input2)
p generate_combinations("**").size
Run Code Online (Sandbox Code Playgroud)
运行上面代码的输出是(略微编辑):
["abcadea", "abcgdea", "abcadeb", "abcgdeb", "abcadec",
"abcgdec", "abcaded", "abcgded", "abcadee", "abcgdee",
"abcadef", "abcgdef", "abcadeg", "abcgdeg", "abcadeh",
"abcgdeh", "abcadei", "abcgdei", "abcadej", "abcgdej",
"abcadek", "abcgdek", "abcadel", "abcgdel", "abcadem",
"abcgdem", "abcaden", "abcgden", "abcadeo", "abcgdeo",
"abcadep", "abcgdep", "abcadeq", "abcgdeq", "abcader",
"abcgder", "abcades", "abcgdes", "abcadet", "abcgdet",
"abcadeu", "abcgdeu", "abcadev", "abcgdev", "abcadew",
"abcgdew", "abcadex", "abcgdex", "abcadey", "abcgdey",
"abcadez", "abcgdez"]
["abcadem", "abcgdem", "abcaden", "abcgden", "abcadel",
"abcgdel", "abcadeo", "abcgdeo", "abcadep", "abcgdep"]
676 # The number of two letter words i.e. 26*26
Run Code Online (Sandbox Code Playgroud)
如果您对上述代码有任何疑问,请随时询问.