【问题标题】:Removing tags in lisp program删除 lisp 程序中的标签
【发布时间】:2013-03-06 22:17:30
【问题描述】:

我需要编程方面的帮助。我正在使用 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 行之后,我必须输入代码来检查标签,但我不知道该使用什么。每次我调用 removedelete 方法时,都会出现错误。我不知道我是否没有正确地称呼他们或其他什么。有人可以帮忙吗?

【问题讨论】:

    标签: xml tags lisp


    【解决方案1】:

    我认为你的问题不是很清楚。为什么你问从字符串列表中删除标签,而你的示例代码从文件中读取行?假设您确实在询问字符串列表,标签是否可以分布在多个这些字符串上?此外,您询问了removedelete,而没有提及您真正尝试过什么以及它是如何失败的。如果您想直接更改文件的内容,那么您不能只是从流中删除内容并期望它能够正常工作。

    这是一种通过逐个字符读取流来删除标签的简单方法:

    (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"
    

    如果您想读取和写入文件,只需将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 库,或者使用正则表达式并祈祷。解析和处理 XML 是一个问题,在实际使用中几乎所有语言的许多库中都已解决,并且有很多细节会出错(如果你真的只是想删除一些标签,也许不是这样,但是 principiis obsta),无论如何,它是一个相当无聊的练习。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      相关资源
      最近更新 更多