Извлечение строки из коллекций clojure с использованием регулярных выражений

Можете ли вы предложить мне самый короткий и простой способ извлечения подстроки из последовательности строк? Я получаю эту коллекцию с помощью среды enlive, которая берет контент с определенной веб-страницы, и вот что я получаю в результате:

("background-image:url('http://s3.mangareader.net/cover/gantz/gantz-r0.jpg')"
 "background-image:url('http://s3.mangareader.net/cover/deadman-wonderland/deadman-wonderland-r0.jpg')"
 "background-image:url('http://s3.mangareader.net/cover/12-prince/12-prince-r1.jpg')" )

Я хотел бы получить некоторую помощь в извлечении URL-адреса из каждой строки в последовательности. Я пробовал что-то с функцией разделения, но безуспешно. Может ли кто-нибудь предложить регулярное выражение или любой другой подход к этой проблеме?

Спасибо


person Мitke    schedule 08.05.2012    source источник


Ответы (2)


re-seq на помощь!

(map #(re-seq #"http.*jpg" %) d)
(("http://s3.mangareader.net/cover/gantz/gantz-r0.jpg")  
("http://s3.mangareader.net/cover/deadman-wonderland/deadman-wonderland-r0.jpg") 
("http://s3.mangareader.net/cover/12-prince/12-prince-r1.jpg"))
user> 

re-find еще лучше:

user> (map #(re-find #"http.*jpg" %) d)
("http://s3.mangareader.net/cover/gantz/gantz-r0.jpg" 
 "http://s3.mangareader.net/cover/deadman-wonderland/deadman-wonderland-r0.jpg" 
 "http://s3.mangareader.net/cover/12-prince/12-prince-r1.jpg")

потому что он не добавляет дополнительный слой seq.

person Arthur Ulfeldt    schedule 08.05.2012
comment
Привет, отличное решение, большое спасибо !!!! Кстати, не могли бы вы порекомендовать мне учебник по регулярным выражениям в clojure, чтобы не обращаться за помощью каждый раз, когда мне приходится с ними связываться? - person Мitke; 09.05.2012
comment
Я бы тоже хотела такое найти, кто-нибудь? - person Arthur Ulfeldt; 09.05.2012
comment
Лучшее, что я могу придумать, это позвонить (find-doc #"^re-") и прочитать результаты. Я не знаю ничего лучше. - person Retief; 09.05.2012
comment
Что касается самого синтаксиса регулярных выражений, стоит отметить, что он такой же, как в Java, поэтому любое из многих учебных пособий по Java имеет значение, например. tutorials.jenkov.com/java-regex/syntax.html - person mikera; 09.05.2012

Подойдет ли вам что-то простое вроде этого?

(defn extract-url [s]
  (subs s (inc (.indexOf s "'")) (.lastIndexOf s "'")))

Эта функция вернет строку, содержащую все символы между первой и последней одинарными кавычками.

Предполагая, что ваша последовательность строк называется ss, тогда:

(map extract-url ss)
;=> ("http://s3.mangareader.net/cover/gantz/gantz-r0.jpg"
;    "http://s3.mangareader.net/cover/deadman-wonderland/deadman-wonderland-r0.jpg"
;    "http://s3.mangareader.net/cover/12-prince/12-prince-r1.jpg")

Это определенно не универсальное решение, но оно соответствует предоставленным вами данным.

person Jeremy    schedule 08.05.2012
comment
Да, это работает как шарм. Я думал, что это можно сделать более элегантно с помощью регулярных выражений, но это более полно для ОО-парня, такого как я. Спасибо - person Мitke; 08.05.2012