Clojure Regex:如果string是一个URL,则返回字符串

时间:2015-02-01 23:17:06

标签: regex clojure clojurescript

如何在Clojure中返回给定字符串的有效URL。

 (re-matches #"????" "www.example.com"))
 (re-matches #"????" "http://example.com"))
 (re-matches #"????" "http://example.org")) // returns "http://example.org"
 (re-matches #"????" "htasdtp:/something")) // returns nil

2 个答案:

答案 0 :(得分:10)

验证网址并不简单。也许用regexp验证它太复杂了。幸运的是,有一个名为 Apache Commons 的库,其中包含UrlValidator

由于Clojure可以使用Java库,因此您可以使用Apache Commons' UrlValidator用于验证程序中的URL。

首先,在project.clj中添加依赖项。在依赖关系向量中添加以下行。

[commons-validator "1.4.1"]

然后,您可以定义一个返回布尔值的函数valid-url?

(import 'org.apache.commons.validator.UrlValidator)

(defn valid-url? [url-str]
  (let [validator (UrlValidator.)]
    (.isValid validator url-str)))

现在,您可以使用此功能执行所需操作。或者,您可以修改上述函数,以便在其参数为有效URL时返回URL字符串。

答案 1 :(得分:1)

询问如何在ClojureScript中验证URL基本上是在如何在Javascript中执行它,因为ClojureScript正则表达式编译为本机JavaScript正则表达式。

这是一个包含许多关于如何使用正则表达式验证网址的变体的页面:https://mathiasbynens.be/demo/url-regex

这是Diego Pierini's Javascript solution

/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i

在ClojureScript中:

(def url-pattern #"(?i)^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$")

(re-matches url-pattern "http://www.google.com")