Regex: соответствует URL, но не домену электронной почты - PullRequest
0 голосов
/ 30 мая 2018

У меня очень свободное регулярное выражение для соответствия любому виду URL внутри строки: [a-z]+[:.].*?(?=\s|$) Единственная проблема заключается в том, что это регулярное выражение также будет соответствовать домену электронной почты, когда вместо этого я хочу исключить из соответствия любой адрес электронной почты.

Если быть точным, я хочу следующее совпадение (соответствующая строка выделена жирным шрифтом)

test example.com test

test emailstring@ myemail.com

Любое решение, которое я пробовал, исключает emailstring и соответствует myemail.com

Вот более полный тестовый пример https://regex101.com/r/NsxzCM/3/

1 Ответ

0 голосов
/ 30 мая 2018

Это двухэтапное предложение, в котором используется регулярное выражение 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);
...