获取clojure上regexp的所有匹配项
我正试图解析一个HTML文件并获取其中的所有href 到目前为止,我使用的代码是:获取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,但没有成功
(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是一个不错的选择。