Function: wildcard-to-regexp
wildcard-to-regexp is a byte-compiled function defined in files.el.gz.
Signature
(wildcard-to-regexp WILDCARD)
Documentation
Given a shell file name pattern WILDCARD, return an equivalent regexp.
The generated regexp will match a file name only if the file name
matches that wildcard according to shell rules. Only wildcards known
by sh are supported.
Source Code
;; Defined in /usr/src/emacs/lisp/files.el.gz
(defun wildcard-to-regexp (wildcard)
"Given a shell file name pattern WILDCARD, return an equivalent regexp.
The generated regexp will match a file name only if the file name
matches that wildcard according to shell rules. Only wildcards known
by `sh' are supported."
(let* ((i (string-match "[[.*+\\^$?]" wildcard))
;; Copy the initial run of non-special characters.
(result (substring wildcard 0 i))
(len (length wildcard)))
;; If no special characters, we're almost done.
(if i
(while (< i len)
(let ((ch (aref wildcard i))
j)
(setq
result
(concat result
(cond
((and (eq ch ?\[)
(< (1+ i) len)
(eq (aref wildcard (1+ i)) ?\]))
"\\[")
((eq ch ?\[) ; [...] maps to regexp char class
(progn
(setq i (1+ i))
(concat
(cond
((eq (aref wildcard i) ?!) ; [!...] -> [^...]
(progn
(setq i (1+ i))
(if (eq (aref wildcard i) ?\])
(progn
(setq i (1+ i))
"[^]")
"[^")))
((eq (aref wildcard i) ?^)
;; Found "[^". Insert a `\0' character
;; (which cannot happen in a filename)
;; into the character class, so that `^'
;; is not the first character after `[',
;; and thus non-special in a regexp.
(progn
(setq i (1+ i))
"[\000^"))
((eq (aref wildcard i) ?\])
;; I don't think `]' can appear in a
;; character class in a wildcard, but
;; let's be general here.
(progn
(setq i (1+ i))
"[]"))
(t "["))
(prog1 ; copy everything upto next `]'.
(substring wildcard
i
(setq j (string-search
"]" wildcard i)))
(setq i (if j (1- j) (1- len)))))))
((eq ch ?.) "\\.")
((eq ch ?*) "[^\000]*")
((eq ch ?+) "\\+")
((eq ch ?^) "\\^")
((eq ch ?$) "\\$")
((eq ch ?\\) "\\\\") ; probably cannot happen...
((eq ch ??) "[^\000]")
(t (char-to-string ch)))))
(setq i (1+ i)))))
;; Shell wildcards should match the entire filename,
;; not its part. Make the regexp say so.
(concat "\\`" result "\\'")))