字符串公共Lisp的Subseq计数问题

字符串公共Lisp的Subseq计数问题,lisp,common-lisp,Lisp,Common Lisp,我试图使用函数count来告诉我一个标记出现了多少次,但我似乎无法让它工作。我的代码: (count "<script>" "<p>Hello World</p><script>javascript goes here</script>" :key #'string :test #'equal) 我似乎找不到太多的例子,但我确实找到了一个用于删除的例子,我认为它们是相似的。如何使其返回1而不是0?仅计算匹配的单个元素,因此您可以使用它

我试图使用函数count来告诉我一个标记出现了多少次,但我似乎无法让它工作。我的代码:

(count "<script>" "<p>Hello World</p><script>javascript goes here</script>" :key #'string :test #'equal)
我似乎找不到太多的例子,但我确实找到了一个用于删除的例子,我认为它们是相似的。如何使其返回1而不是0?

仅计算匹配的单个元素,因此您可以使用它来计算\a字符,例如,但不计算子字符串。要计算子字符串,您需要以下内容:

(defun count-substrings (substring string)
  (loop
    with sub-length = (length substring)
    for i from 0 to (- (length string) sub-length)
    when (string= string substring
                  :start1 i :end1 (+ i sub-length))
    count it))

当然,像这样计算html标记很容易出错。您可能需要使用实际的解析器。

使用原语函数的简明解决方案:

编辑
在第一个版本中,计数从0开始,但这是不正确的。

我将研究解析器。你推荐哪一种,cl html解析?我自己还没有用过,但我很快就试用过,它似乎工作得很好,而且很容易使用。对于非常大的文档,它可能不是最有效的方法,因为它将其解析为一个列表,但是对于较小的片段,它应该是好的。如果您需要解析大型文档,请尝试。您不想使用subseq。那将非常昂贵。请注意,string=具有start和end的关键字参数…@jkiiski如何使用cl-html5-parser导航构建dom。如果我有以下代码html5解析器:parse-html5-fragment-drakma:http请求https://en.wikipedia.org/wiki/List_of_the_heaviest_people :dom:xmls如何获取标记下的信息?你知道使用解析器有什么好的教程吗?@phile如果你使用的是:dom:xmls,你应该看看哪个可以与cl-html5-parser一起使用。标签基本上编码在列表中,如名称属性子项*。您将希望递归地搜索子对象。我为找到给定标记的第一次出现做了一次尝试。如果你需要更多的帮助,我想你最好再问一个问题。你想计算重叠的实例吗?例如,如果你想计算aaa,你应该得到baaaab返回1还是2?最多有一个不同的实例,但如果它们可以重叠,则有两个实例。没有重叠实例,但我想我将使用HTML解析器。@phile这绝对是一个更可靠的解决方案。@phile说,如果您感兴趣,在您的问题之前不久,有一个非常类似的问题问:。概念就在那里,但细节并不正确。当没有子字符串时,将返回1。您需要设置要搜索的位置的初始值…:start2 0或完全忽略start2参数。@谢谢,我已通过从-1开始计数更正了答案。
(defun count-substring(substring string)
  (do ((count -1 (+ count 1))
       (position -1 (search substring string :start2 (1+ position))))
      ((null position) count)))