Schemeの数値リテラルにマッチする正規表現(2)

短くしてたんだけど,\dが使えない所為で1割伸びた.2217bytes.

/(?:(?:#b(?:#[ei])?|(?:#[ei])?#b)(?:(?:[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*))
)|(?:[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*))@[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[
01]+#*)))|(?:[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*))[+-](?:(?:[01]+#*)|(?:[01]
+#*\/[01]+#*))?i)|(?:[+-](?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*))?i)))|(?:(?:#o(?:#[
ei])?|(?:#[ei])?#o)(?:(?:[+-]?(?:(?:[0-7]+#*)|(?:[0-7]+#*\/[0-7]+#*)))|(?:[+-]?(
?:(?:[0-7]+#*)|(?:[0-7]+#*\/[0-7]+#*))@[+-]?(?:(?:[0-7]+#*)|(?:[0-7]+#*\/[0-7]+#
*)))|(?:[+-]?(?:(?:[0-7]+#*)|(?:[0-7]+#*\/[0-7]+#*))[+-](?:(?:[0-7]+#*)|(?:[0-7]
+#*\/[0-7]+#*))?i)|(?:[+-](?:(?:[0-7]+#*)|(?:[0-7]+#*\/[0-7]+#*))?i)))|(?:(?:(?:
#d)?(?:#[ei])?|(?:#[ei])?(?:#d)?)(?:(?:[+-]?(?:(?:[0-9]+#*)|(?:[0-9]+#*\/[0-9]+#
*)|(?:(?:[0-9]+#*(?:[esfdl][+-]?[0-9]+)?)|(?:\.[0-9]+#*(?:[esfdl][+-]?[0-9]+)?)|
(?:[0-9]+\.[0-9]*#*(?:[esfdl][+-]?[0-9]+)?)|(?:\.[0-9]+#+\.#*(?:[esfdl][+-]?[0-9
]+)?))))|(?:[+-]?(?:(?:[0-9]+#*)|(?:[0-9]+#*\/[0-9]+#*)|(?:(?:[0-9]+#*(?:[esfdl]
[+-]?[0-9]+)?)|(?:\.[0-9]+#*(?:[esfdl][+-]?[0-9]+)?)|(?:[0-9]+\.[0-9]*#*(?:[esfd
l][+-]?[0-9]+)?)|(?:\.[0-9]+#+\.#*(?:[esfdl][+-]?[0-9]+)?)))@[+-]?(?:(?:[0-9]+#*
)|(?:[0-9]+#*\/[0-9]+#*)|(?:(?:[0-9]+#*(?:[esfdl][+-]?[0-9]+)?)|(?:\.[0-9]+#*(?:
[esfdl][+-]?[0-9]+)?)|(?:[0-9]+\.[0-9]*#*(?:[esfdl][+-]?[0-9]+)?)|(?:\.[0-9]+#+\
.#*(?:[esfdl][+-]?[0-9]+)?))))|(?:[+-]?(?:(?:[0-9]+#*)|(?:[0-9]+#*\/[0-9]+#*)|(?
:(?:[0-9]+#*(?:[esfdl][+-]?[0-9]+)?)|(?:\.[0-9]+#*(?:[esfdl][+-]?[0-9]+)?)|(?:[0
-9]+\.[0-9]*#*(?:[esfdl][+-]?[0-9]+)?)|(?:\.[0-9]+#+\.#*(?:[esfdl][+-]?[0-9]+)?)
))[+-](?:(?:[0-9]+#*)|(?:[0-9]+#*\/[0-9]+#*)|(?:(?:[0-9]+#*(?:[esfdl][+-]?[0-9]+
)?)|(?:\.[0-9]+#*(?:[esfdl][+-]?[0-9]+)?)|(?:[0-9]+\.[0-9]*#*(?:[esfdl][+-]?[0-9
]+)?)|(?:\.[0-9]+#+\.#*(?:[esfdl][+-]?[0-9]+)?)))?i)|(?:[+-](?:(?:[0-9]+#*)|(?:[
0-9]+#*\/[0-9]+#*)|(?:(?:[0-9]+#*(?:[esfdl][+-]?[0-9]+)?)|(?:\.[0-9]+#*(?:[esfdl
][+-]?[0-9]+)?)|(?:[0-9]+\.[0-9]*#*(?:[esfdl][+-]?[0-9]+)?)|(?:\.[0-9]+#+\.#*(?:
[esfdl][+-]?[0-9]+)?)))?i)))|(?:(?:#x(?:#[ei])?|(?:#[ei])?#x)(?:(?:[+-]?(?:(?:\h
+#*)|(?:\h+#*\/\h+#*)))|(?:[+-]?(?:(?:\h+#*)|(?:\h+#*\/\h+#*))@[+-]?(?:(?:\h+#*)
|(?:\h+#*\/\h+#*)))|(?:[+-]?(?:(?:\h+#*)|(?:\h+#*\/\h+#*))[+-](?:(?:\h+#*)|(?:\h
+#*\/\h+#*))?i)|(?:[+-](?:(?:\h+#*)|(?:\h+#*\/\h+#*))?i)))/i
exponent_marker = /[esfdl]/.source
sign = /[+-]?/.source
exactness = /(?:#[ei])?/.source
radix_ary = [/#b/, /#o/, /(?:#d)?/, /#x/].map(&:source)
digit = /[0-9]/.source
digit_ary = [/[01]/, /[0-7]/, /[0-9]/, /\h/].map(&:source)
suffix = /(?:#{exponent_marker}#{sign}#{digit}+)?/.source

ary = Array.new(4) {|i|
  r_prefix = /#{radix_ary[i]}#{exactness}|#{exactness}#{radix_ary[i]}/
  r_nosign_integer = /#{digit_ary[i]}+#*/
  r_float = if 2 == i
              Regexp.union(/#{r_nosign_integer.source}#{suffix}/,
                           /\.#{digit}+#*#{suffix}/,
                           /#{digit}+\.#{digit}*#*#{suffix}/,
                           /\.#{digit}+#+\.#*#{suffix}/)
            end
  ary = [r_nosign_integer, /#{r_nosign_integer.source}\/#{r_nosign_integer.source}/]
  ary << r_float if r_float
  r_nosign_real = Regexp.union(ary)
  r_real = /#{sign}#{r_nosign_real}/
  r_complex = Regexp.union(r_real,
                           /#{r_real.source}@#{r_real.source}/,
                           /#{r_real.source}[+-]#{r_nosign_real}?i/,
                           /[+-]#{r_nosign_real}?i/)
  r_number = /#{r_prefix}#{r_complex}/
}

re = Regexp.new(Regexp.union(ary).source.gsub(/-mix/, ""), Regexp::IGNORECASE)