2015-03-30 35 views
0

我想在Clojurescript的字符串中返回有效的URL(作为子字符串),我可以使用什么正则表达式?Clojure正则表达式:给定一个字符串,如何返回该字符串中的有效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" 
+0

你如何定义一个有效的URL? 'example.com'是有效的,正如'a.b.c.d.e.f.example.co.uk'。你会在域名中支持unicode字符吗?你需要支持URL编码的字符串,参数和子域名吗? – OnlineCop 2015-03-31 00:35:05

+0

这不是关于clojure,jvm或clojurescript的问题。你只是要求某人为你写一个正则表达式;而且他们甚至不确定要使用哪种正则表达式,因为您添加了多个冲突的语言标记。 – amalloy 2015-03-31 00:49:29

+0

@amalloy正则表达式正是我所要求的。 – 2015-03-31 01:32:06

回答

0

根据您希望如何小心你的脚本来验证URL,您所提供的正则表达式,只要你摆脱“^”和“$”锚,效果相当好(as seen here)。

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

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

您需要删除'^'和'$'锚点的原因在于,只有当网址是唯一的网址时,该模式才会匹配:^必须在该行的开头匹配,和$只能在最后匹配。拥有<b>www.google.com</b>意味着<b>将使^锚点无法匹配网址,因为它不是从行首开始的。

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

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

相关问题