Я хочу найти все ссылки в тексте. Например, с помощью этого ввода:
foo [https://www.example.com/link1](https://www.example.com/link2) data
bar https://www.example.com/link3?test[0]=val data data
xyz https://www.example.com/link4] test foo
https://www.example.com/link5
Я хочу получить следующие ссылки:
https://www.example.com/link1
https://www.example.com/link2
https://www.example.com/link3?test[0]=val
https://www.example.com/link4
https://www.example.com/link5
Мне удалось создать это регулярное выражение:
(http[s]*://((?!\s|(?<!\[\d)\]|\)).)*)
Но у меня в матче есть дополнительная группа, чего мне бы хотелось избежать. Что мне делать, чтобы ограничить группу только 1?
Или, если вы хотите сопоставлять только цифры в квадратных скобках \bhttps?://[^][()\s]*(?:\[\d+][^][\s]*)*regex101.com/r/doiURT/1
@Thefourthbird, отлично! оно работает. И последнее — как я могу осветить это дело: https://www.example.com/link1https://www.example.com/link2. Я хотел бы получить 2 ссылки на это
@Thefourthbird Это касается этого случая: https://www.example.com/link1https://www.example.com/link2, но не распространяется на этот: https://test.pl?test[0]=valhttps://test.pl?test[0]=val
Могут быть неожиданные совпадения, что, если в строке есть test[0]=http://www.test
@Thefourthbird Я предполагаю, что часть https:// отмечает начало новой ссылки. Я пришел с этим: regex101.com/r/yPnlnh/1 но кажется, что это очень медленно
Возможно вот так https?://(?:(?!https?://)[^][\s](?:\[\d+])*)*regex101.com/r/xl6g3s/1
Это сработало?
Отвечает ли это на ваш вопрос? Регулярное выражение для поиска URL-адресов внутри строки
@yivi Эта страница не является подходящим дубликатом для этого конкретного вопроса.





Вы можете использовать:
https?://(?:(?!https?://)[^][\s](?:\[\d+])*)*
Узор соответствует:
https?:// Сопоставьте протокол с необязательным s, за которым следует ://(?: Группа без захвата повторяется целиком
(?!https?://) Негативный просмотр вперед: утверждение, что то, что находится справа, не является http:// или https://.[^][\s] Соответствует символу без пробелов, кроме [](?:\[\d+])* При желании повторите [ 1+ цифры и ])* Закройте группу без захвата и повторите 0 или более раз.Посмотрите демонстрацию регулярных выражений .
@bobblebubble Привет! Я думаю, что для JavaScript этот синтаксис тоже подойдет, верно? regex101.com/r/I0w08l/1
Ваше регулярное выражение должно быть:
https\://w{3}[\.\w+]+(/\w+)+(\?[\w\[\]\=]+)?
JavaScript-решение:
const arr = [
'foo [https://www.example.com/link1](https://www.example.com/link2) data',
'bar https://www.example.com/link3?test[0]=val data data',
'xyz https://www.example.com/link4] test foo',
'https://www.example.com/link5'
];
console.info(arr.map(x => x.match(/https\://w{3}[\.\w+]+(/\w+)+(\?[\w\[\]\=]+)?/gi)));Ваши последние требования:
Насколько я понимаю, вы хотите сопоставить только первое вхождение.
В каждом языке программирования, когда мы сопоставляем шаблон, он возвращает массив подстроок. Если вы запустите приведенный выше код, вы увидите аналогичный результат.
Итак, после возврата соответствующего шаблона захватите только 1-й элемент.
Пример решения JavaScript:
const arr = [
'foo [https://www.example.com/link1](https://www.example.com/link2) data',
'bar https://www.example.com/link3?test[0]=val data data',
'xyz https://www.example.com/link4] test foo',
'https://www.example.com/link5'
];
console.info(arr.map(x => x.match(/https\://w{3}[\.\w+]+(/\w+)+(\?[\w\[\]\=]+)?/gi)[0]));
Попробуйте вот так
\bhttps://[^][()\s]*(?:\[[^][\s]*\][^][\s]*)*regex101.com/r/0CsUY4/1