如何在Ruby中解析包含通配符和字符类的字符串?

Eth*_*han 0 ruby parsing

我想编写一个脚本,它接受一个可能如下所示的参数:

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)

这是我被卡住的地方.我不知道怎么把它分成这样的碎片.

有关如何处理它的任何建议?

sri*_*ris 5

这是一个非常紧凑的解决方案.它并没有针对性能进行优化,这会对您提供的模式施加一些限制,例如,太多的通配符可能不是最好的主意.

这是代码

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)

如果您对上述代码有任何疑问,请随时询问.