【问题标题】:Clojure Regex: given a string, how can I return valid URLs in that string?Clojure Regex:给定一个字符串,如何在该字符串中返回有效的 URL?
【发布时间】:2015-03-30 22:29:22
【问题描述】:

我试图在 Clojurescript 的字符串中返回有效的 URL(作为子字符串),我可以使用什么正则表达式?

(re-find #"regex for valid URL" "You can visit www.google.com")
=> "www.google.com"
(re-find #"regex for valid URL" "<b>www.google.com</b>")
=> "www.google.com"
(re-find #"regex for valid URL" "<b>www.google.com</b> and www.yahoo.com")
=> "www.google.com, www.yahoo.com"

【问题讨论】:

  • 你如何定义一个有效的 URL? example.com 是有效的,a.b.c.d.e.f.example.co.uk 也是有效的。是否支持域名中的 unicode 字符?您需要对 URL 编码字符串、参数和子域的支持吗?
  • 这不是关于 clojure、jvm 或 clojurescript 的问题。您只是要求有人为您编写正则表达式;他们甚至不确定要使用哪种正则表达式,因为您添加了多个冲突的语言标签。
  • @amalloy 一个正则表达式正是我想要的。
  • @OnlineCop 是的,我并没有说得太清楚,而且我事先没有考虑过。我想我只想到 example.com、www.example.com,但没有什么比编码字符串更高级的了。 a.b.c.d.e.f.example.co.uk 似乎也不错。我正在使用这个#"^[a-zA-Z0-9\-\.]+\.(com|org|me|io|net|co|edu|uk|ca|de|jp|fr|au|us|ru|ch|it|nl|se|no|es)$"
  • goog.string.linkify.findFirstUrl: github.com/google/closure-library/blob/… 鉴于您想要多个,您可能必须在循环和子字符串中调用该函数,直到找不到任何内容。

标签: regex clojure jvm clojurescript


【解决方案1】:

根据您希望脚本验证 URL 的仔细程度,您提供的正则表达式,只要您去掉 '^' 和 '$' 锚点,就可以很好地工作 (as seen here)。

请注意,我在正则表达式中添加了一些空格只是为了便于阅读。

我从该正则表达式中看到了几个问题(正如您可能在该页面上看到的那样)。它在不应该匹配的地方匹配(例如重复的.. 字符),并且带有.co.uk 的站点分别匹配.co 部分以及域名和.uk。这本身就很容易解决,只需将这些边缘情况直接添加到第二组(带有(com|org|...) 的那一组)。

您需要删除 '^' 和 '$' 锚点的原因是,只有当 URL 是行中唯一的内容时,模式才会匹配:^ 必须在行首匹配, 而$ 只能在最后匹配。拥有&lt;b&gt;www.google.com&lt;/b&gt; 意味着&lt;b&gt; 将使^ 锚点无法匹配URL,因为它不是从行首开始的。

其他建议,例如@amalloy 的链接,提供了更全面的解决方案,并且可以正确匹配所有内容,但非常复杂。

因此,确切地知道你想要匹配什么,以及你愿意忽略/交易/放弃什么,将有助于打造适合你的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2016-12-19
    • 2014-01-14
    相关资源
    最近更新 更多