RegEx для сопоставления конкретных URL-адресов со строчными и тире - PullRequest
2 голосов
/ 11 мая 2019

Каждое утро я захожу на этот сайт, который называется mtonews.com, и пытаюсь создать ярлык iOS с RegEx, чтобы открывать все новостные ссылки на сайтах.

На сайте есть несколько ссылок:

https://mtonews.com/rihanna-teams-up-with-lvmh-for-fashion-brand    
https://mtonews.com/ciara-goes-naked-for-new-album-release

https://www.btserve.com/serve?t=bidt-sra&v=1&pubId=168&siteId=512&placementUid=5ae8e4105e-168%7C5&pgid=78ff2e45-8b3c-6a06-465f-2ac1a107f4f6&o=https://mtonews.com/&amp    
https://mtonews.com/.image/t_share/MTYzOTYyODY2ODAwNTM1Mzc3/steve_marjorie.png

И я хочу, чтобы RegEx открыла все ссылки, похожие на первые две.

Это то, что я имею до сих пор:

^(?!image$|btserve$).*mtonews.com.*$

Ответы [ 3 ]

2 голосов
/ 11 мая 2019

Этот инструмент может помочь вам спроектировать выражения по вашему желанию. Захват групп - это самые простые функции регулярных выражений, с которыми вы можете шаг за шагом связать желаемые результаты. Например,

^((https?.*)(mtonews.com\/)([A-Za-z0-9-]+))$

имеет четыре группы захвата, одну для протокола, одну для домена, одну для ведущих URL-адресов и первую, которая включает в себя все эти три группы, и может быть просто вызвана как $1.

enter image description here

Описательный график RegEx

График показывает, как он работает, и вы можете проверить другие выражения в этой ссылке :

enter image description here

Базовый тест производительности

Этот фрагмент JavaScript возвращает время выполнения цикла for в миллион раз для повышения производительности.

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	const string = 'https://mtonews.com/rihanna-teams-up-with-lvmh-for-fashion-brand';
	const regex = /^((https?.*)(mtonews.com\/)([A-Za-z0-9-]+))$/gm;
	var match = string.replace(regex, "\nGroup #1: $1\nGroup #2: $2 \nGroup #3: $3 \nGroup #4: $4 \n");
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ??? ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ? ");

Вы можете просто изменить и упростить это выражение.

1 голос
/ 11 мая 2019

В вашем паттерне ^(?!image$|btserve$).*mtonews.com.*$ вы используете отрицательный прогноз, утверждающий, что строка не начинается с изображения или btserve, за которым следует конец строки.

Это верно для всех примеров, и поскольку все они содержат mtonews.com, все они будут совпадать.

Если вы хотите сопоставить URL-адреса, начинающиеся с протокола http, и URL-адрес mtonews.com/, используя отрицательный прогноз (?!\.image), чтобы удостовериться, что следующее не .image, вы можете поместить его после косой черты:

^https?://mtonews\.com/(?!\.image).*$
  • ^ Начало строки
  • https?:// Сопоставить начало с необязательным s
  • mtonews\.com/ Совпадение mtonew.com с последующей косой чертой и экранирование точки, чтобы буквально соответствовать ей
  • (?!\.image) Отрицательный взгляд, утверждаю, что то, что прямо справа, не является .image
  • .* Соответствует любому символу, кроме новой строки, до конца строки
  • $ Конец строки

Regex demo

Обратите внимание, что вы можете заменить .*$ на \S+$, чтобы сопоставить непробельные символы для URL, поскольку точка также соответствует пробелу.

1 голос
/ 11 мая 2019

Если я правильно понимаю

^(?!.*(?:image|btserve)).*mtonews\.com.*$

https://regex101.com/r/n2ckJC/1

 ^                             # BOS
 (?!                           # Assert
      .* 
      (?: image | btserve )         # Does not contain eiher of these
 )
 .* mtonews \. com .* $        # Must contain this domain
...