negative に対応するとすると、まずはこんな感じで元の正規表現と同じ長さ
の任意の文字列にマッチする正規表現を作ってやり、マッチした文字列が元の
正規表現とマッチしないことを確認するといいんじゃないだろうか。
アルゴリズムは >>451-453 になるだろうね。

(defun split-regexp (regexp)
(let ((re (mapconcat #'identity
'("\\\\\\\\" "\\\\(\\?:" "\\\\[sScC]."
"\\\\{[0-9]*\\(,[0-9]*\\)?\\\\}" "\\\\."
"\\[^?]?\\(\\[:[a-z]+:\\]\\|[^]]\\)*\\]"
".")
"\\|"))
(start 0) r)
(while (string-match re regexp start)
(push (match-string 0 regexp) r)
(setq start (max (1+ start) (match-end 0))))
(nreverse r)))

(defun translate-regexp-to-dot (regexp)
(apply #'concat
(mapcar (lambda (re)
(if (or (member re '("*" "+" "?" "^" "$"))
(and (not (string= re "\\\\"))
(string-match "\\`\\\\" re)))
re
"."))
(split-regexp regexp))))