正则表达式,忽略前面字符的结果

时间:2014-10-29 11:32:23

标签: php regex

我有匹配网址((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)的正则表达式,它可以完成工作,它可以满足我的需要。但是,当我不想要它时,它也会匹配电子邮件的域名。

目前匹配:

  • http://www.foo.bar
  • foo.bar
  • 网站: foo.bar (与foo.bar部分匹配)
  • info @ foo.bar (与foo.bar部分匹配)

我不希望它与最后一个匹配,所以它只匹配前三个。我尝试在前面添加(?!=@)但是没有这样做。如何让它忽略前面带有@符号的结果?

3 个答案:

答案 0 :(得分:2)

为正则表达式添加锚点

^((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)$

参见示例http://regex101.com/r/lI8kZ6/1

<强> Explantion

^在行的开头声明正则表达式

$在行的末尾断言正则表达式

修改

如果网址嵌入在文本中,请使用\s将正则表达式匹配字符串删除为

(\s|^)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)\s

参见示例

http://regex101.com/r/lI8kZ6/3

答案 1 :(得分:2)

仅当您的字符串 包含您要匹配的网址时,才能使用锚点。情况可能并非如此。

相反,您真正想要的是匹配URL前面有空格(或没有空格)的位置。尝试:

(?:^|(?<=\s))YOUR REGEX HERE

这将检查你已经拥有的正则表达式之前是否有空格或空格字符。

Demo on regex101

考虑进一步将(?=\s|$)添加到正则表达式的末尾,以确保它与半个单词不匹配。

答案 2 :(得分:1)

^((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/[\S]*)?)$

添加锚点以删除部分匹配。启用mmultliline标记。参见演示。

http://regex101.com/r/sU3fA2/43