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

Я пытаюсь написать регулярное выражение в python, которое будет либо соответствовать URL (например, https://www.foo.com/), либо домену, который начинается с "sc-domain:", но не имеет https или путь.

Например, нижеприведенные записи должны пройти

https://www.foo.com/
https://www.foo.com/bar/
sc-domain:www.foo.com

Однако приведенные ниже записи должны завершиться ошибкой

htps://www.foo.com/
https:/www.foo.com/bar/
sc-domain:www.foo.com/
sc-domain:www.foo.com/bar
scdomain:www.foo.com

Сейчас я работаю со следующим:

^(https://*/|sc-domain:^[^/]*$)

Это почти работает, но все же позволяет отправлять такие документы, как sc-domain: www.foo.com/. В частности, часть ^[^/]*$ не фиксирует, что символ '/' не должен проходить.

Ответы [ 3 ]

4 голосов
/ 10 мая 2019
^((?:https://\S+)|(?:sc-domain:[^/\s]+))$

Вы можете попробовать это.

См. Демо.

https://regex101.com/r/xXSayK/2

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

Вы можете использовать это регулярное выражение,

^(?:https?://www\.foo\.com(?:/\S*)*|sc-domain:www\.foo\.com)$

Объяснение:

  • ^ - Начало строки
  • (?: - Начало не группы для чередования
  • https?://www\.foo\.com(?:/\S*)* - Соответствует URL-адресу, начинающемуся с http: // или https: //, за которым следует www.foo.com, а затем необязательно, за которым следует путь, используя
  • | - чередование строк, начинающихся с sc-domain:
  • sc-domain:www\.foo\.com - Эта часть начинает совпадать с sc-domain: далее следует www.foo.com и, далее, не допускает файлпуть
  • )$ - закрытие шаблона не группирования и конца строки.

Regex Demo

Также немного не уверен, хотите ли вы разрешить какой-либо случайный домен, но в случае, если вы хотите разрешить, вы можете использовать это регулярное выражение,

^(?:https?://(?:\w+\.)+\w+(?:/\S*)*|sc-domain:(?:\w+\.)+\w+)$

Regex Demo, разрешающее любой домен

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

Это выражение также будет делать это с использованием двух простых групп захвата, которые вы можете изменить по своему усмотрению:

^((http|https)(:\/\/www.foo.com)(\/.*))|(sc-domain:www.foo.com)$

Я также добавил http, который вы можете удалить, если он может быть нежелательным.

enter image description here

JavaScript-тест

const regex = /^(((http|https)(:\/\/www.foo.com)(\/.*))|(sc-domain:www.foo.com))$/gm;
const str = `https://www.foo.com/
https://www.foo.com/bar/
sc-domain:www.foo.com
http://www.foo.com/
http://www.foo.com/bar/
`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Тест с Python

Вы можете просто протестировать с Python и добавить желаемые группы захвата:

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"^((http|https)(:\/\/www.foo.com)(\/.*))|(sc-domain:www.foo.com)$"

test_str = ("https://www.foo.com/\n"
    "https://www.foo.com/bar/\n"
    "sc-domain:www.foo.com\n"
    "http://www.foo.com/\n"
    "http://www.foo.com/bar/\n\n"
    "htps://www.foo.com/\n"
    "https:/www.foo.com/bar/\n"
    "sc-domain:www.foo.com/\n"
    "sc-domain:www.foo.com/bar\n"
    "scdomain:www.foo.com")

subst = "$1 $2"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Редактировать

Основываясь на советах Pushpesh , вы можете использовать lookaround и упростить его до:

^((https?)(:\/\/www.foo.com)(\/.*))|(sc-domain:www.foo.com)$
...