正则expression式在string中查找URL

有谁知道一个正则expression式,我可以用它来查找string中的url? 我在Google上find了很多正则expression式来确定整个string是否是一个URL,但我需要能够search整个string的URL。 例如,我希望能够在以下string中findwww.google.comhttp://yahoo.com

 Hello www.google.com World http://yahoo.com 

我不查找string中的特定url。 我正在寻找string中的所有url,这就是为什么我需要一个正则expression式。

这是我使用的一个

 (http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])? 

为我工作,也应该为你工作。

猜猜没有正则expression式是完美的这个用法。 我在这里发现了一个非常坚实的人

 /(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/igm 

与此处发布的其他内容相比有一些差异/优势:

  • 它不符合电子邮件地址
  • 它确实匹配localhost:12345
  • 它不会检测到没有httpwww moo.com

看这里的例子

以上所有答案都与URL中的Unicode字符不匹配,例如: http : //google.com?query=đức+filan+đã+search

对于解决scheme,这个应该工作:

 (ftp:\/\/|www\.|https?:\/\/){1}[a-zA-Z0-9u00a1-\uffff0-]{2,}\.[a-zA-Z0-9u00a1-\uffff0-]{2,}(\S*) 

这里提供的解决scheme都没有解决我遇到的问题/使用案例。

我在这里提供的是迄今为止我find的最好的。 当我发现它不处理的新边缘案例时,我会更新它。

 \b #Word cannot begin with special characters (?<![@.,%&#-]) #Protocols are optional, but take them with us if they are present (?<protocol>\w{2,10}:\/\/)? #Domains have to be of a length of 1 chars or greater ((?:\w|\&\#\d{1,5};)[.-]?)+ #The domain ending has to be between 2 to 15 characters (\.([az]{2,15}) #If no domain ending we want a port, only if a protocol is specified |(?(protocol)(?:\:\d{1,6})|(?!))) \b #Word cannot end with @ (made to catch emails) (?![@]) #We accept any number of slugs, given we have a char after the slash (\/)? #If we have endings like ?=fds include the ending (?:([\w\d\?\-=#:%@&.;])+(?:\/(?:([\w\d\?\-=#:%@&;.])+))*)? #The last char cannot be one of these symbols .,?!,- exclude these (?<![.,?!-]) 

如果你有url模式,你应该能够在你的string中search它。 只要确保模式没有^$标记urlstring的开始和结束。 所以如果P是URL的模式,那么找P的匹配。

这是一个稍微改进/调整(取决于你需要什么)Rajeev的答案:

 ([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[AZ\-_]+)+))([AZ\-\.,@?^=%&amp;:/~\+#]*[AZ\-\@?^=%&amp;/~\+#]){2,6}? 

看到这里的一个例子,它做什么和不匹配。

我摆脱了“http”等检查,因为我想赶上url没有这个。 我微微添加到正则expression式来捕捉一些混淆的url(即用户使用[点]而不是“。”)。 最后,我用“AZ”replace了“\ w”和“{2,3}”,以减less像v2.0和“moo.0dd”这样的误报。

任何改善这个欢迎。

简单而简单。 我还没有在JavaScript代码testing,但它看起来会起作用:

 ((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*)) 

代码regex101.com

代码预览

如果你必须严格select链接,我会去:

 (?i)\b((?:[az][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”''])) 

欲了解更多信息,请阅读以下内容:

一种改进的自由准确的正则expression式来匹配URL

我使用下面的正则expression式来查找string中的url:

/(http|https)://[a-zA-Z0-9-.]+.[a-zA-Z]{2,3}(/\S*)?/

我使用在两个点或句点之间find文本的逻辑

下面的正则expression式正常工作与Python

 (?<=\.)[^}]*(?=\.) 

这是最好的一个。

 NSString *urlRegex="(http|ftp|https|www|gopher|telnet|file)(://|.)([\\w_-]+(?:(?:\\.[\\w_-]+)‌​+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?"; 

在文本中匹配URL不应该太复杂

(?:(?:(?:ftp|http)[s]*:\/\/|www\.)[^\.]+\.[^ \n]+)

https://regex101.com/r/wewpP1/2

String regex = "[a-zA-Z0-9]+[.]([.a-zA-Z0-9])+";

这也适用于你的情况。