(defun string-split-if (predicate string)
(if (equal string "")
(list (copy-seq string))
(do* ((result '())
(begin 0 (+ end 1))
(end #1=(position-if predicate string :start begin) #1#))
((not end)
(nreverse (push (subseq string begin) result)))
(push (subseq string begin end) result))))
(defun extract-numbers (string &key (radix 10) (only-integers nil))
(check-type radix (integer 2 36))
(let ((*read-base* radix)
(digits (concatenate 'string
(subseq "0123456789abcdefghijklmnopqrstuvwxyz"
0 radix)
(if only-integers "" "."))))
(loop for x in (string-split-if (complement (lambda (c)
(find c digits
:test #'char-equal)))
string)
for n = (ignore-errors (read-from-string x nil nil))
when (numberp n)
collect n)))
(print (extract-numbers "「12あいうえお34.5かき7.0くけこ」"))
(print (extract-numbers "「0.12ABC3.45DE0.02FGH」"))
(print (extract-numbers "「0.12ABC3.45DE0.02FGH」" :radix 16))
(print (extract-numbers "「0.12ABC3.45DE0.02FGH」" :radix 16 :only-integers t))
KGRlZnVuIHN0cmluZy1zcGxpdC1pZiAocHJlZGljYXRlIHN0cmluZykKICAoaWYgKGVxdWFsIHN0cmluZyAiIikKICAgICAgKGxpc3QgKGNvcHktc2VxIHN0cmluZykpCiAgICAgIChkbyogKChyZXN1bHQgJygpKQogICAgICAgICAgICAoYmVnaW4gMCAoKyBlbmQgMSkpCiAgICAgICAgICAgIChlbmQgIzE9KHBvc2l0aW9uLWlmIHByZWRpY2F0ZSBzdHJpbmcgOnN0YXJ0IGJlZ2luKSAjMSMpKQogICAgICAgICAgICgobm90IGVuZCkKICAgICAgICAgICAgKG5yZXZlcnNlIChwdXNoIChzdWJzZXEgc3RyaW5nIGJlZ2luKSByZXN1bHQpKSkKICAgICAgICAocHVzaCAoc3Vic2VxIHN0cmluZyBiZWdpbiBlbmQpIHJlc3VsdCkpKSkKCihkZWZ1biBleHRyYWN0LW51bWJlcnMgKHN0cmluZyAma2V5IChyYWRpeCAxMCkgKG9ubHktaW50ZWdlcnMgbmlsKSkKICAoY2hlY2stdHlwZSByYWRpeCAoaW50ZWdlciAyIDM2KSkKICAobGV0ICgoKnJlYWQtYmFzZSogcmFkaXgpCiAgICAgICAgKGRpZ2l0cyAoY29uY2F0ZW5hdGUgJ3N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWJzZXEgIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgcmFkaXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIG9ubHktaW50ZWdlcnMgIiIgIi4iKSkpKQogICAgKGxvb3AgZm9yIHggaW4gKHN0cmluZy1zcGxpdC1pZiAoY29tcGxlbWVudCAobGFtYmRhIChjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5kIGMgZGlnaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnRlc3QgIydjaGFyLWVxdWFsKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZykKICAgICAgICAgIGZvciBuID0gKGlnbm9yZS1lcnJvcnMgKHJlYWQtZnJvbS1zdHJpbmcgeCBuaWwgbmlsKSkKICAgICAgICAgIHdoZW4gKG51bWJlcnAgbikKICAgICAgICAgICAgY29sbGVjdCBuKSkpCgoocHJpbnQgKGV4dHJhY3QtbnVtYmVycyAi44CMMTLjgYLjgYTjgYbjgYjjgYozNC4144GL44GNNy4w44GP44GR44GT44CNIikpCihwcmludCAoZXh0cmFjdC1udW1iZXJzICLjgIwwLjEyQUJDMy40NURFMC4wMkZHSOOAjSIpKQoocHJpbnQgKGV4dHJhY3QtbnVtYmVycyAi44CMMC4xMkFCQzMuNDVERTAuMDJGR0jjgI0iIDpyYWRpeCAxNikpCihwcmludCAoZXh0cmFjdC1udW1iZXJzICLjgIwwLjEyQUJDMy40NURFMC4wMkZHSOOAjSIgOnJhZGl4IDE2IDpvbmx5LWludGVnZXJzIHQpKQo=