在clojure中获取正则表达式的所有匹配项

时间:2012-06-04 21:33:02

标签: regex clojure

我正在尝试解析HTML文件并获取其中的所有href。

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

(map 
   #(println (str "Match: " %)) 
   (re-find #"(?sm)href=\"([a-zA-Z.:/]+)\"" str_response))

str_response是其中包含HTML代码的字符串。根据我对Clojure的基本理解,该代码应该打印一份匹配列表,但到目前为止,没有运气。 它不会崩溃,但它也不匹配任何东西。 我尝试使用re-seq代替re-find,但没有运气。有什么帮助吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

通常虽然you cannot parse html with a regex(有趣的答案),但只是找到一个标签的所有出现应该是可行的。

一旦你弄清楚正确的正则表达式re-seq是你想要使用的函数:

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

这对你来说没有崩溃,因为重新查找返回nil,哪个地图正在解释为空列表并且什么都不做

答案 1 :(得分:3)

这看起来像是一个HTML抓取问题,在这种情况下,我会建议使用enlive

这样的事情应该有效

(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])))

答案 2 :(得分:2)

我认为您的代码没有任何问题。也许str_response是嫌疑人。以下内容适用于http://google.com和正则表达式:

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

注意ref-find也可以,但它只返回一个匹配。