регулярное выражение для string.split (), которое разбивает строку на URL - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть выражение регулярного выражения для поиска URL-адресов в строке, но когда я использую его с String.prototype.split (), он возвращает неопределенные.

const regex = /(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g;
const str = "yay http://www.google.com woo www.google.com haha google.com";

console.log(str.match(regex));
// [ 'http://www.google.com', 'www.google.com', 'google.com' ]

console.log(str.split(regex));
// [ 'yay ','http://w',undefined,undefined,'',' woo ',undefined,undefined,'www.','',' haha ',undefined,undefined,undefined,'','' ]

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

const reg2 = /(?:http(?:s)?:\/\/.)?(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&//=]*)/g

const str = "yay http://www.google.com woo www.google.com haha google.com";

console.log(str.split(reg2));
// [ 'yay ', ' woo ', ' haha ', '' ]

Но в нем пропущены URL-адреса. Я ожидаю возвращения:

[ 'yay ', 'http://www.google.com', ' woo ', 'www.google.com', ' haha ', 'google.com' ]

1 Ответ

2 голосов
/ 20 февраля 2020

Вы можете просто разделить пробел здесь:

var str = "yay http://www.google.com woo www.google.com haha google.com";
var parts = str.split(/\s+/);
console.log(parts);

Если здесь действительно требуются начальные / конечные пробелы, попробуйте выполнить поиск по шаблону:

<URL>|\s*\S+\s*

Это будет соответствовать либо URL, либо серия не состоящих из слов символов, с окружающими пробелами. Рассмотрим:

var str = "yay http://www.google.com woo www.google.com haha google.com";
console.log(str.match(/(?:http(s)?:\/\/.)?(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&//=]*)|\s*\S+\s*/g));

При этом используется альтернативный трюк, чтобы сначала попытаться выборочно использовать URL-адрес без окружающих пробелов. В случае неудачи резервным шаблоном является \s*\S\s*, то есть любое другое слово с пробелом в начале / конце.

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