正则表达式:匹配网址但不匹配电子邮件域

时间:2018-05-30 12:20:11

标签: regex email url

我有一个非常宽松的正则表达式来匹配字符串中的任何类型的url:[a-z]+[:.].*?(?=\s|$) 唯一的问题是这个正则表达式也会匹配电子邮件的域名,而我想从匹配项中排除任何电子邮件地址。

准确地说,我确实想要以下匹配(粗体匹配的字符串)

  

测试 example.com 测试

     

测试emailstring@myemail.com

我尝试过的任何解决方案都会排除emailstring并匹配myemail.com

这是一个更完整的测试用例https://regex101.com/r/NsxzCM/3/

2 个答案:

答案 0 :(得分:2)

以下是使用带有lambdas的正则表达式replace的两步提案。 第一个正则表达式查找看起来像普通URL的所有内容一个电子邮件,然后第二个正则表达式过滤掉看起来像电子邮件地址的字符串:



input = 
  "test\n" +
  "example.com\n" +
  "www.example.com\n" +
  "test sub.example.com test\n" +
  "http://example.com\n" +
  "test http://www.example.com test\n" +
  "http://sub.example.com\n" +
  "https://example.com\n" +
  "https://www.example.com\n" +
  "https://sub.example.com\n" +
  "\n" +
  "test example@example.com <- i don't want to match this\n" +
  "example@example.co.uk    <- i don't want to match this\n" +
  "\n" +
  "git://github.com/user/project-name.git\n" +
  "irc://irc.undernet.org:6667/mIRC jhasbdjkbasd\n";

includeRegex = /(?:[\w/:@-]+\.[\w/:@.-]*)+(?=\s|$)/g ;
excludeRegex = /.*@.*/ ;

result = input.replace(includeRegex, function(s) {
  if (excludeRegex.test(s)) {
    return s; // leave as-is
  } else {
    return "(that's a non-email url: " + s +")";
  }
});

console.log(result);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

(:^|[^@\.\w-])([-\w:.]{1,256}\.[\w()]{1,6}\b)

有帮助,但我不知道为什么它也匹配额外的 \

相关问题