KMRCLを眺める(230) MULTIWORD-MATCH — #:g1

Posted 2010-12-04 13:34:00 GMT

今回はKMRCLのstrmatch.lispから、MULTIWORD-MATCHです。
ドキュメント文字列によると、区切り文字や単語の位置には無関係で、大文字小文字も区別しないで文字列に含まれる単語群が同一のものかを判定するようです。
動作は、

(kl:multiword-match "foo        bar   baz" "foo,bar,baz")
;=> T

(kl:multiword-match "***foo/bar/baz**" "FOO,BAZ,bar") ;=> T

(kl:multiword-match "***foo/bar/baz**" "FOO,BAZ,bbb") ;=> NIL

というところ
定義は、
(defun multiword-match (s1 s2)
  "Matches two multiword strings, ignores case, word position, punctuation"
  (let* ((word-list-1 (split-alphanumeric-string s1))
         (word-list-2 (split-alphanumeric-string s2))
         (n1 (length word-list-1))
         (n2 (length word-list-2)))
    (when (= n1 n2)
      ;; remove each word from word-list-2 as walk word-list-1
      (dolist (w word-list-1)
        (let ((p (position w word-list-2 :test #'string-equal)))
          (unless p
            (return-from multiword-match nil))
          (setf (nth p word-list-2) "")))
      t)))
となっています。
SPLIT-ALPHANUMERIC-STRINGが肝ですが、これはKMRCLのもので以前に取り上げています。

comments powered by Disqus