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

Bol*_*lza 1 regex email url

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

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

测试example.com测试

测试 emailstring@myemail.com

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

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

And*_*kin 5

这是一个将正则表达式replace与 lambda 结合使用的两步提案。第一个正则表达式查找所有看起来像普通 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);
Run Code Online (Sandbox Code Playgroud)