在字符串中查找URL的正则表达式


94

有人知道我可以用来在字符串中查找URL的正则表达式吗?我在Google上发现了很多正则表达式,用于确定整个字符串是否为URL,但是我需要能够在整个字符串中搜索URL。例如,我希望能够在以下字符串中找到www.google.comhttp://yahoo.com

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

我不在字符串中寻找特定的URL。我正在寻找字符串中的所有URL,这就是为什么我需要一个正则表达式。


如果您有整个字符串的表达式,只需取出^和$即可使它们与字符串的某些部分匹配。
entonio

Answers:


205

这是我用的那个

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

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


7
不要忘记逃脱正斜线。
标记

1
现在是2017年,Unicode域名无处不在。\w可能与国际符号不匹配(取决于正则表达式引擎),而是需要该范围:a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF
迈克尔·安提平

3
这对于一般用途来说很好,但是在很多情况下它并没有抓住。这将强制您的链接以协议为前缀。如果选择忽略协议,则像test@testing.com一样接受电子邮件结尾。
Squazz

4
[\w_-]应该[\w-]吗?因为已经\w匹配_。每个mozilla文件
Transang

2
已投票支持,但此答案对问题的要求无效www.yahoo.com"""(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?""".r.findAllIn("www.google.com").toList。还缺少解释的答案
祈祷

44

猜猜没有正则表达式适合此用途。我在这里找到了一个不错的人

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

与此处发布的其他产品相比,有一些差异/优点:

  • 匹配的电子邮件地址
  • 它确实匹配localhost:12345
  • 如果moo.com没有httpwww

请参阅此处的示例


4
它与www.e匹配。这不是有效的网址
Ihor Herasymchuk

g选项在所有正则表达式实现中均无效(例如Ruby的内置实现)。
Huliax

23
text = """The link of this question: /programming/6038061/regular-expression-to-find-urls-within-a-string
Also there are some urls: www.google.com, facebook.com, http://test.com/method?param=wasd
The code below catches all urls in text and returns urls in list."""

urls = re.findall('(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+', text)
print(urls)

输出:

[
    '/programming/6038061/regular-expression-to-find-urls-within-a-string', 
    'www.google.com', 
    'facebook.com',
    'http://test.com/method?param=wasd'
]

Kotlin val urlRegex =“(?:( ?: https?| ftp):\\ / \\ /)?[\\ w / \\-?=%。] + \\。[\\ w / \\- ?=%。] +“
Akshay Nandwana,

&网址中缺少参数。例如,http://test.com/method?param=wasd&param2=wasd2错过了param2
TrophyGeek,

9

这里提供的解决方案都无法解决我遇到的问题/用例。

我在这里提供的是迄今为止我发现/做出的最好的。当我发现它无法处理的新边缘情况时,我将对其进行更新。

\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
  (\.([a-z]{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
(?<![.,?!-])

1
有什么方法可以使此javascript友好?由于命名的捕获组在那里没有完全发挥作用,因此协议值检查不会生效。
einord

6

我认为这种正则表达式模式恰好可以满足您的需求

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

这是提取Urls的摘要示例:

// The Regular Expression filter
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

// The Text you want to filter for urls
$text = "The text you want  /programming/6038061/regular-expression-to-find-urls-within-a-string to filter goes here.";

// Check if there is a url in the text
preg_match_all($reg_exUrl, $text, $url,$matches);
var_dump($matches);

4

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

对于该解决方案,该解决方案应该起作用:

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

2
根据URL(faqs.org/rfcs/rfc1738.html)上的RFC 1738禁止使用Unicode字符。必须对它们进行百分比编码以符合标准-尽管我认为它可能最近才发生变化-值得阅读 w3.org/International/articles/idn-and-iri
mrswadge

@mrswadge我只介绍案例。我们不确定是否所有人都关心该标准。感谢您的信息。
杜克·菲兰

只有这一个对我来说非常适合使用网址,例如“ example.com ”“ www.exmaple.com”“ example.com ”“ example.co.in ”“ exmaple.com/?q='me '”
Krissh

4

如果您必须严格选择链接,我将寻求:

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

有关更多信息,请阅读:

一种改进的自由,准确的正则表达式模式,用于匹配URL


2
不要那样做 Regular-expressions.info/catastrophic.html它会杀死您的应用程序…
Auric

4

我发现其中涵盖大部分样本的链接,包括子目录部分。

正则表达式是:

(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?


2

如果您具有url模式,则应该可以在字符串中搜索它。只要确保该模式没有,^$标记url字符串的开始和结束即可。因此,如果P是URL的模式,请查找P的匹配项。


这是我发现的正则表达式,用于验证整个字符串是否为URL。如您所说,我在开始时取出了^,在结尾处取出了$,但仍然不起作用。我究竟做错了什么? ^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&amp;%\$#\=~])*[^\.\,\)\(\s]$
user758263 2011年

如果您显示使用的语言可能会有所帮助。无论哪种方式,请务必检查http://regexpal.com/;在那里,您可以针对字符串测试不同的表达式,直到正确为止。
entonio

@ user758263-您真的需要URL这么复杂的正则表达式吗?取决于您可能实际找到的可能的网址。另请参阅gskinner.com/RegExr以试用正则表达式。他们还在Community标签下的右侧有数百个示例,包括用于URL的示例
manojlds

我正在尝试查找所有可能的URL,并且正在使用C ++。感谢您的链接entonio和manojlds。gskinner网站特别有用,因为它有样本。
user758263 2011年



1

简短而简单。我尚未在javascript代码中进行过测试,但看起来可以使用:

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

regex101.com上的代码

代码预览


1
我喜欢您的正则表达式,因为它正是我想要的:我需要从某些文本中识别URL并将其剥离,而不是验证。在铁轨上工作。
达格玛

@Dagmar我很高兴听到:)
bafsar

1

一个可能过于简单的方法,但可行的方法可能是:

[localhost|http|https|ftp|file]+://[\w\S(\.|:|/)]+

我在Python上测试了它,只要字符串解析在前后包含一个空格,而在url中没有一个空格(我从未见过),就可以了。

这是一个在线演示

但是,使用它有一些好处:

  • 它可以识别file:localhostIP地址
  • 没有他们,它永远不会匹配
  • 它不介意诸如#或的不寻常字符-(请参阅此文章的网址)

1

使用@JustinLevene提供的正则表达式在反斜杠上没有正确的转义序列。已更新为现在正确,并添加了条件以匹配FTP协议:将匹配所有带有或不带有协议,没有“ www”的url。

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

示例:https//regex101.com/r/uQ9aL4/65



1

自己写一个:

let regex = /([\w+]+\:\/\/)?([\w\d-]+\.)*[\w-]+[\.\:]\w+([\/\?\=\&\#]?[\w-]+)*\/?/gm

它适用于以下所有域:

https://www.facebook.com
https://app-1.number123.com
http://facebook.com
ftp://facebook.com
http://localhost:3000
localhost:3000/
unitedkingdomurl.co.uk
this.is.a.url.com/its/still=going?wow
shop.facebook.org
app.number123.com
app1.number123.com
app-1.numbEr123.com
app.dashes-dash.com
www.facebook.com
facebook.com
fb.com/hello_123
fb.com/hel-lo
fb.com/hello/goodbye
fb.com/hello/goodbye?okay
fb.com/hello/goodbye?okay=alright
Hello www.google.com World http://yahoo.com
https://www.google.com.tr/admin/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services
https://google.com.tr/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services
http://google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services
ftp://google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services
www.google.com.tr/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services
www.google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services
drive.google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services
https://www.example.pl
http://www.example.com
www.example.pl
example.com
http://blog.example.com
http://www.example.com/product
http://www.example.com/products?id=1&page=2
http://www.example.com#up
http://255.255.255.255
255.255.255.255

您可以在regex101上查看其效果,并根据需要进行调整


0

这对(取决于您的需求)拉杰夫的答案略有改进/调整:

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

请参阅此处以了解其功能与不匹配的示例。

我摆脱了对“ http”等的检查,因为我想在没有此URL的情况下捕获URL。我在正则表达式中稍加添加了一些模糊的URL(即用户使用[点]而不是“。”的地方)。最后,我将“ \ w”替换为“ AZ”,并将“ {2,3}”替换为v2.0和“ moo.0dd”之类的误报。

对此欢迎的任何改进。


[a-zA-Z]{2,3}对于匹配TLD真的很差,请参阅官方列表:data.iana.org/TLD/tlds-alpha-by-domain.txt。另外,您的正则表达式匹配_.........&&&&&&不确定其是否为有效网址。
Toto 2015年

感谢JE SUIS CHAELIE,有什么改进建议(尤其是对于误报)?
avjaarsveld 2015年


0
(?:vnc|s3|ssh|scp|sftp|ftp|http|https)\:\/\/[\w\.]+(?:\:?\d{0,5})|(?:mailto|)\:[\w\.]+\@[\w\.]+

如果您需要每个部分的解释,请尝试regexr [。] com,在其中您将获得每个字符的出色解释。

用“ |”分隔 或“ OR”,因为并非所有可用的URI都带有“ //”,因此您可以在此处创建要对匹配感兴趣的方案或条件的列表。


0

我已经利用了C#Uri类,并且可以很好地与IP地址,本地主机一起使用

 public static bool CheckURLIsValid(string url)
    {
        Uri returnURL;

       return (Uri.TryCreate(url, UriKind.Absolute, out returnURL)
           && (returnURL.Scheme == Uri.UriSchemeHttp || returnURL.Scheme == Uri.UriSchemeHttps));


    }

0

我喜欢Stefan Henze的解决方案,但可以提高到34.56。它太笼统了,我还没有解析HTML。一个网址有4个锚点;

www

http:\(和co),

。然后是字母,然后是/,

或信件。以及其中之一:https : //ftp.isc.org/www/survey/reports/current/bynum.txt

我从该线程中使用了很多信息。谢谢你们。

"(((((http|ftp|https|gopher|telnet|file|localhost):\\/\\/)|(www\\.)|(xn--)){1}([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(([\\w_-]{2,200}(?:(?:\\.[\\w_-]+)*))((\\.[\\w_-]+\\/([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(\\.((org|com|net|edu|gov|mil|int|arpa|biz|info|unknown|one|ninja|network|host|coop|tech)|(jp|br|it|cn|mx|ar|nl|pl|ru|tr|tw|za|be|uk|eg|es|fi|pt|th|nz|cz|hu|gr|dk|il|sg|uy|lt|ua|ie|ir|ve|kz|ec|rs|sk|py|bg|hk|eu|ee|md|is|my|lv|gt|pk|ni|by|ae|kr|su|vn|cy|am|ke))))))(?!(((ttp|tp|ttps):\\/\\/)|(ww\\.)|(n--)))"

上面的代码解决了所有问题,除了字符串“ eurls:www.google.com,facebook.com,http://test.com/”(它以单个字符串返回)外。TBH IDK为什么我添加了Gopher等。证明R代码

if(T){
  wierdurl<-vector()
  wierdurl[1]<-"https://JP納豆.例.jp/dir1/納豆 "
  wierdurl[2]<-"xn--jp-cd2fp15c.xn--fsq.jp "
  wierdurl[3]<-"http://52.221.161.242/2018/11/23/biofourmis-collab"
  wierdurl[4]<-"https://12000.org/ "
  wierdurl[5]<-"  https://vg-1.com/?page_id=1002 "
  wierdurl[6]<-"https://3dnews.ru/822878"
  wierdurl[7]<-"The link of this question: /programming/6038061/regular-expression-to-find-urls-within-a-string
  Also there are some urls: www.google.com, facebook.com, http://test.com/method?param=wasd
  The code below catches all urls in text and returns urls in list. "
  wierdurl[8]<-"Thelinkofthisquestion:/programming/6038061/regular-expression-to-find-urls-within-a-string
  Alsotherearesomeurls:www.google.com,facebook.com,http://test.com/method?param=wasd
  Thecodebelowcatchesallurlsintextandreturnsurlsinlist. "
  wierdurl[9]<-"Thelinkofthisquestion:/programming/6038061/regular-expression-to-find-urls-within-a-stringAlsotherearesomeurlsZwww.google.com,facebook.com,http://test.com/method?param=wasdThecodebelowcatchesallurlsintextandreturnsurlsinlist."
  wierdurl[10]<-"1facebook.com/1res"
  wierdurl[11]<-"1facebook.com/1res/wat.txt"
  wierdurl[12]<-"www.e "
  wierdurl[13]<-"is this the file.txt i need"
  wierdurl[14]<-"xn--jp-cd2fp15c.xn--fsq.jpinspiredby "
  wierdurl[15]<-"[xn--jp-cd2fp15c.xn--fsq.jp/inspiredby "
  wierdurl[16]<-"xnto--jpto-cd2fp15c.xnto--fsq.jpinspiredby "
  wierdurl[17]<-"fsety--fwdvg-gertu56.ffuoiw--ffwsx.3dinspiredby "
  wierdurl[18]<-"://3dnews.ru/822878 "
  wierdurl[19]<-" http://mywebsite.com/msn.co.uk "
  wierdurl[20]<-" 2.0http://www.abe.hip "
  wierdurl[21]<-"www.abe.hip"
  wierdurl[22]<-"hardware/software/data"
  regexstring<-vector()
  regexstring[2]<-"(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?"
  regexstring[3]<-"/(?:(?:https?|ftp|file):\\/\\/|www\\.|ftp\\.)(?:\\([-A-Z0-9+&@#\\/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#\\/%=~_|$?!:,.])*(?:\\([-A-Z0-9+&@#\\/%=~_|$?!:,.]*\\)|[A-Z0-9+&@#\\/%=~_|$])/igm"
  regexstring[4]<-"[a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]?"
  regexstring[5]<-"((http|ftp|https)\\:\\/\\/)?([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?"
  regexstring[6]<-"((http|ftp|https):\\/\\/)?([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?"
  regexstring[7]<-"(http|ftp|https)(:\\/\\/)([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?"
  regexstring[8]<-"(?:(?:https?|ftp|file):\\/\\/|www\\.|ftp\\.)(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[A-Z0-9+&@#/%=~_|$])"
  regexstring[10]<-"((http[s]?|ftp):\\/)?\\/?([^:\\/\\s]+)((\\/\\w+)*\\/)([\\w\\-\\.]+[^#?\\s]+)(.*)?(#[\\w\\-]+)?"
  regexstring[12]<-"http[s:/]+[[:alnum:]./]+"
  regexstring[9]<-"http[s:/]+[[:alnum:]./]+" #in DLpages 230
  regexstring[1]<-"[[:alnum:]-]+?[.][:alnum:]+?(?=[/ :])" #in link_graphs 50
  regexstring[13]<-"^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-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,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$"
  regexstring[14]<-"(((((http|ftp|https):\\/\\/)|(www\\.)|(xn--)){1}([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(([\\w_-]+(?:(?:\\.[\\w_-]+)*))((\\.((org|com|net|edu|gov|mil|int)|(([:alpha:]{2})(?=[, ]))))|([\\/]([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?))))(?!(((ttp|tp|ttps):\\/\\/)|(ww\\.)|(n--)))"
  regexstring[15]<-"(((((http|ftp|https|gopher|telnet|file|localhost):\\/\\/)|(www\\.)|(xn--)){1}([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(([\\w_-]{2,200}(?:(?:\\.[\\w_-]+)*))((\\.[\\w_-]+\\/([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(\\.((org|com|net|edu|gov|mil|int|arpa|biz|info|unknown|one|ninja|network|host|coop|tech)|(jp|br|it|cn|mx|ar|nl|pl|ru|tr|tw|za|be|uk|eg|es|fi|pt|th|nz|cz|hu|gr|dk|il|sg|uy|lt|ua|ie|ir|ve|kz|ec|rs|sk|py|bg|hk|eu|ee|md|is|my|lv|gt|pk|ni|by|ae|kr|su|vn|cy|am|ke))))))(?!(((ttp|tp|ttps):\\/\\/)|(ww\\.)|(n--)))"
    }

for(i in wierdurl){#c(7,22)
  for(c in regexstring[c(15)]) {
    print(paste(i,which(regexstring==c)))
    print(str_extract_all(i,c))
  }
}

-1

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

下面的正则表达式可以在python上正常工作

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



-1

这很简单。

使用此模式: \b((ftp|https?)://)?([\w-\.]+\.(com|net|org|gov|mil|int|edu|info|me)|(\d+\.\d+\.\d+\.\d+))(:\d+)?(\/[\w-\/]*(\?\w*(=\w+)*[&\w-=]*)*(#[\w-]+)*)?

它匹配任何包含以下内容的链接:

允许的协议:http,https和ftp

允许的域:* .com,*。net,*。org,*。gov,*。mil,*。int,*。edu,*。info和* .me或IP

允许的端口:true

允许的参数:true

允许的哈希值:true


-2

这是最好的。

NSString *urlRegex="(http|ftp|https|www|gopher|telnet|file)(://|.)([\\w_-]+(?:(?:\\.[\\w_-]+)‌​+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.