(defun match (pattern string)
(let ((i 0)
(len (length string))
star)
(loop
for c across pattern
while (< i len)
do
(case c
(#\* (setf star t))
(#\? (incf i))
(otherwise (if star
(loop while (and (< i len) (not (eql c (elt string i))))
do (incf i)
finally (incf i) (setf star nil))
(if (eql c (elt string i))
(incf i)
(return))))))
(and (= i len) (>= len (length pattern)))))
(princ (match "as*d*?qwe*qwe" "as123dssqwe12345678qwe"))
KGRlZnVuIG1hdGNoIChwYXR0ZXJuIHN0cmluZykKICAobGV0ICgoaSAwKQogICAgICAgIChsZW4gKGxlbmd0aCBzdHJpbmcpKQogICAgICAgIHN0YXIpCiAgICAobG9vcAogICAgICAgZm9yIGMgYWNyb3NzIHBhdHRlcm4KICAgICAgIHdoaWxlICg8IGkgbGVuKQogICAgICAgZG8KICAgICAgICAgKGNhc2UgYwogICAgICAgICAgICgjXCogKHNldGYgc3RhciB0KSkKICAgICAgICAgICAoI1w/IChpbmNmIGkpKQogICAgICAgICAgIChvdGhlcndpc2UgKGlmIHN0YXIKICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCB3aGlsZSAoYW5kICg8IGkgbGVuKSAobm90IChlcWwgYyAoZWx0IHN0cmluZyBpKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIChpbmNmIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSAoaW5jZiBpKSAoc2V0ZiBzdGFyIG5pbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChlcWwgYyAoZWx0IHN0cmluZyBpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluY2YgaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJldHVybikpKSkpKQogICAgIChhbmQgKD0gaSBsZW4pICg+PSBsZW4gKGxlbmd0aCBwYXR0ZXJuKSkpKSkKCgoocHJpbmMgKG1hdGNoICJhcypkKj9xd2UqcXdlIiAiYXMxMjNkc3Nxd2UxMjM0NTY3OHF3ZSIpKQo=