获取clojure上regexp的所有匹配项

获取clojure上regexp的所有匹配项,regex,clojure,Regex,Clojure,我正试图解析一个HTML文件并获取其中的所有href 到目前为止,我使用的代码是: (map #(println (str "Match: " %)) (re-find #"(?sm)href=\"([a-zA-Z.:/]+)\"" str_response)) str_响应是包含HTML代码的字符串。根据我对Clojure的基本理解,该代码应该打印一个匹配列表,但到目前为止,运气不佳。 它没有崩溃,但也不匹配任何东西。 我尝试过使用re-seq而不是re-find,但没有成功

我正试图解析一个HTML文件并获取其中的所有href

到目前为止,我使用的代码是:

(map 
   #(println (str "Match: " %)) 
   (re-find #"(?sm)href=\"([a-zA-Z.:/]+)\"" str_response))
str_响应是包含HTML代码的字符串。根据我对Clojure的基本理解,该代码应该打印一个匹配列表,但到目前为止,运气不佳。 它没有崩溃,但也不匹配任何东西。 我尝试过使用
re-seq
而不是
re-find
,但没有成功。有什么帮助吗


谢谢

一般认为(有趣的回答),尽管仅仅找到一个标签的所有发生应该是可以的

一旦您确定了正确的正则表达式
re seq
就是您想要使用的函数:

user> (re-find #"aa" "aalkjkljaa")
"aa"
user> (re-seq #"aa" "aalkjkljaa")
("aa" "aa")

这对您来说并不是崩溃,因为re-find返回nil,哪个映射被解释为空列表,什么也不做。在这种情况下,我建议使用

像这样的东西应该有用

(ns test.foo
  (:require [net.cgrand.enlive-html :as html]))

(let [url (html/html-resource
           (java.net.URL. "http://www.nytimes.com"))]
  (map #(-> % :attrs :href) (html/select url [:a])))

我认为你的代码没有任何问题。也许
stru-response
就是嫌疑犯。以下内容适用于您的正则表达式:

(let [str_response (slurp "http://google.com")]
  (map #(println (str "Match: " %)) 
   (re-seq #"(?sm)href=\"([a-zA-Z.:/]+)\"" str_response))

注意
ref find
虽然只返回一个匹配项,但也可以工作。

如果您在问题中包含str_response的值,我可以帮助您处理正则表达式,那么。。。如果你想把事情做好,那就不太可行了。是否要排除引用为CDATA的非XML文本?要排除属于不同命名空间的标记吗?等等,你完全正确:我强烈推荐这个主题的链接答案:)“中心无法容纳…”谢谢你的回答!这似乎是最“优雅”的一个。谢谢你的回答,出于某种原因,我的项目中的代码没有打印任何东西,我决定无论如何都使用Julien的解决方案。谢谢你抽出时间!不客气。就解析html而言,Chris Grand的enlive是一个不错的选择。