def initialize(pat)
stack = []
regex = ['']
escape = false
dot = false
i = 0
while i < pat.length
c = pat[i,1]
if escape
regex.last << Regexp.escape(c)
escape = false
i += 1
next
elsif pat[i,2] == "**"
if dot
regex.last << "(?![^\\.])"
dot = false
end
if pat[i+2,1] == "."
regex.last << "(?:.*\\.|\\A)"
i += 3
else
regex.last << ".*"
i += 2
end
next
elsif dot
regex.last << "\\."
dot = false
end
if c == "\\"
escape = true
elsif c == "."
dot = true
elsif c == "*"
regex.last << "[^\\.]*"
elsif c == "{"
stack.push []
regex.push ''
elsif c == "}" && !stack.empty?
stack.last << regex.pop
regex.last << Regexp.union(*stack.pop.map {|r| Regexp.new(r) }).to_s
elsif c == "," && !stack.empty?
stack.last << regex.pop
regex.push ''
elsif c =~ /[a-zA-Z0-9_]/
regex.last << c
else
regex.last << "\\#{c}"
end
i += 1
end
until stack.empty?
stack.last << regex.pop
regex.last << Regexp.union(*stack.pop).to_s
end
@regex = Regexp.new("\\A"+regex.last+"\\Z")
end