JavaScript разделение регулярных выражений URL - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть Regex, способный обнаруживать URL-адреса (Раскрытие информации: я скопировал это Regex из Интернета).

Моя цель - разбить строку, чтобы получить массив подстрок, которые либоПолный URL или нет.

Например.

const detectUrls = // some magical Regex
const input = 'Here is a URL: https://google.com <- That was the URL to Google.';

console.log(input.split(detectUrls)); // This should output ['Here is a URL: ', 'https://google.com', ' <- That was the URL to Google.']

Мое текущее решение Regex выглядит следующим образом: /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-.~]+)*(\/([a-z0-9_\-.]*)(\?[a-z0-9+_\-.%=&amp;]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi;

Однако, когда я запускаю пример кода смое регулярное выражение, я получаю бесполезный ответ:

[ 'Here is a URL: ', 
  'https://google.com', 
  'https://', 
  'google.com', 
  'google.', 
  'com', 
  undefined, 
  undefined, 
  undefined, 
  undefined, 
  undefined, 
  undefined, 
  ' ', 
  '<- That was the URL to Google.',
]

Кто-нибудь сможет указать мне правильное направление?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Причина, по которой вы получаете несколько совпадений, состоит в том, что регулярное выражение возвращает совпадение для каждой из ваших групп (то, что находится в скобках).
Для получения требуемого результата вы должны использовать группы без захвата (?:myRegex)
Я изменил ваше регулярное выражение так, чтобы оно работало:

/((?:[a-z]+:\/\/)?(?:(?:[a-z0-9\-]+\.)+(?:[a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(?::[0-9]{1,5})?(?:\/[a-z0-9_\-.~]+)*(?:\/(?:[a-z0-9_\-.]*)(?:\?[a-z0-9+_\-.%=&amp;]*)?)?(?:#[a-zA-Z0-9!$&'(?:)*+.=-_~:@/?]*)?)(?:\s+|$)/

Совет: используйте веб-сайт типа https://regex101.com/ для проверки ваших регулярных выражений.
Также помог ответ на этот вопроснемного:
Использование групп захвата в String.split ()

0 голосов
/ 26 февраля 2019

Попробуйте:

var detectUrls = /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-.~]+)*(\/([a-z0-9_\-.]*)(\?[a-z0-9+_\-.%=&amp;]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi;

var input = "Here is a URL: https://google.com";

alert(input.match(detectUrls));

Рабочая скрипка: https://jsfiddle.net/as2pbe3m/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...