1

何かをプログラミングするのに助けが必要です。私は Common Lisp でコーディングしており、文字列のリストからタグを削除しようとしています。XML 形式のファイルを読み込んでいます。目的は と の間<にあるテキストをすべて削除すること>です。タグが で始まる場合は、?xmlその行全体を削除する必要があります。removeコマンド ラインで//delete関数を使用できることは知っていますが、実際の Lisp コードでこの削除を実行しようとしていますが、その方法がわかりません。試行するたびにエラーが発生します。

現在、ファイルを読み取るための私のコードは次のとおりです(動作します):

;;;Program: Lisp Assignment 1
;;;Author: Mouse

(defun file-lines (file)
;;;returns a list of strings and the number of
;;;lines read.
    (with-open-file (i file)
    (loop for line = (read-line i nil nil)
          and line-count from 0
          while line
          collect line into lines
          finally (return (values lines line-count)))))

私の考えでは、 という行の後にwhile line、タグをチェックするコードを入力する必要がありますが、何を使用すればよいかわかりません。removeまたはdeleteメソッドを呼び出すたびに、エラーが発生します。私が彼らを正しく呼んでいないのかどうかはわかりません。誰か助けてくれませんか?

4

1 に答える 1

1

あなたの質問はあまり明確ではないと思います。サンプルコードがファイルから行を読み取るときに、文字列のリストからタグを削除することについて尋ねるのはなぜですか? 文字列のリストについて本当に質問していると仮定すると、タグがそれらの文字列の複数に分散されている可能性がありますか? また、実際に何を試し、どのように失敗したかについても、言及せずにremove尋ねます。deleteファイルの内容を直接変更したい場合は、ストリームから何かを削除するだけではうまくいきません。

ストリームから文字ごとに読み取ることによってタグを削除する単純な方法を次に示します。

(defun remove-tags (string)
  (flet ((read-tag (instream)
           (loop for char = (read-char instream nil nil)
                 while (not (string= char #\>)))))
    (with-output-to-string (outstream)
      (with-input-from-string (instream string)
        (loop for char = (read-char instream nil nil)
              while char
              if (char= char #\<) do (read-tag instream)
              else do (write-char char outstream))))))


CL-USER> (remove-tags "<p><a href=\"foo\">bar</a> frob <emph>baz</emph> quux</p>")
"bar frob baz quux"

ファイルから読み書きしたい場合は、 and を適切な形式で置き換えwith-output-to-stringwith-input-from-stringくださいwith-open-file

ただし、これは開始するための単なる例です。これが単なる学術的な演習であっても、より堅牢にする必要があります。たとえば、次の場合に失敗します。

CL-USER> (remove-tags "<p><a href=\"fo>o\">bar</a>")
"o\">bar"

(私の記憶が正しければ、エスケープされていない閉じ山かっこは XML 文字列で使用できます。)

また、これは速度についてテストも最適化もされていません。文字単位の処理が遅すぎる可能性?xmlがあり、タグの削除を処理しません。読者のための演習として残されているすべて。

実際には、XML ライブラリの 1 つを使用するか、regexen を使用して祈る必要があります。XML の解析と処理は、実際に使用されているほぼすべての言語の多くのライブラリで解決されている問題であり、間違いを犯す詳細がたくさんあります (実際にいくつかのタグを削除したい場合はそうではないかもしれませんが、それだけではありません)、とにかく退屈な演習になります。

于 2013-03-07T02:32:56.587 に答える