我有一个正则表达式,将它们之间带有.
的单词匹配为潜在的网址,但不匹配前面带有@
的单词,因为它们被认为是电子邮件。
这是我拥有的正则表达式:
(?:\@(https?:\/\/)?(\w+(\-*\w+)*\.)[a-zA-Z\.]+[\w+\/?\#?\??\=\%\&\-]+.*?)*\K(https?:\/\/)?(\w+(\-*\w+)*\.)[a-zA-Z\.]+[\w+\/?\#?\??\=\%\&\-]+
这不适用于最后一次出现的电子邮件。
例如,对于字符串
twitter.com facebook.com kamur@test.com ksou@uni.edu vimal@gsomething.com balaji@sweets.com john wayne <johnwayne@dc.com> 20,000.00
我希望匹配为twitter.com
和facebook.com
。
但是它也匹配dc.com
。
答案 0 :(得分:4)
在您的(?:\@(https?:\/\/)
中,?
中的https?:
将与 http 或 https 匹配。 ?
的字面意思是字符s
的 0或1 。您在:
中引用的https?:
与文字:
匹配,没什么特别的。
现在,区别在于,如果您的?:
是在 non -逸出的括号之后,那么这意味着non-capturing group。
已转义:
\(?:
,不是非捕获组
未逃脱:(?:
,是一个非捕获组
问题的下一部分,.*?
中的[\w+\/?\#?\??\=\%\&\-]+.*?
指的是什么?
.
将匹配任何字符*
是量词,它将与您的.
(任何字符) 0匹配无限次次*?
使*
非贪婪。 internet search将为您提供很多有关如果您不知道的话,非贪婪匹配的信息。