RegEx для соответствия URL с 4-6 цифрами ID - PullRequest
2 голосов
/ 18 мая 2019

Я пытаюсь сопоставить URL-адреса, которые начинаются с "example.com/" и сопровождаются 4-6 цифрами, а следующий символ не является цифрой (если есть следующий символ).

Например, "example.com/12345" должно совпадать.

"example.com/1234567" должно не совпадать.

"example.com/123456g7" должно совпадать.

Я пробовал "example.com/(\d{4,6}).*", но это соответствует, когда я даю "example.com/1234567", что неверно.

Как мне решить эту проблему?

Ответы [ 3 ]

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

Еще один способ сделать это.

^example\.com/(\d{4,6})(?:\D.*)?$

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

Это выражение добавляет дополнительные границы только для того, чтобы безопасно передать нужные URL-адреса:

^(https?:\/\/(www.)?)(example\.com)\/(?:[0-9]{4,6})?([a-z].*)?$

Если вы хотите, вы можете уменьшить границы. Здесь мы можем добавить несколько групп захвата, чтобы их было проще вызывать.

$ - это ключ, который не позволяет вводить нежелательные URL-адреса.

enter image description here

RegEx

Если это не было вашим желаемым выражением, вы можете изменить / изменить выражения в regex101.com .

RegEx Circuit

Вы также можете визуализировать свои выражения в jex.im :

enter image description here

JavaScript Demo

const regex = /^(https?:\/\/(www.)?)(example\.com)\/(?:[0-9]{4,6})?([a-z].*)?$/gm;
const str = `http://example.com/12345
https://example.com/123456g7
http://www.example.com/12345
https://www.example.com/123456g7
http://www.example.com/12345
https://www.example.com/123456g7
http://www.example.com/123456adfasdfasdf98989898
https://www.example.com/123456g7adfadfa0909009
http://example.com/1234567
https://example.com/1234567`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Python Test

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

import re

regex = r"^(https?:\/\/(www.)?)(example\.com)\/(?:[0-9]{4,6})?([a-z].*)?$"

test_str = ("http://example.com/12345\n"
    "https://example.com/123456g7\n"
    "http://www.example.com/12345\n"
    "https://www.example.com/123456g7\n"
    "http://www.example.com/12345\n"
    "https://www.example.com/123456g7\n"
    "http://www.example.com/123456adfasdfasdf98989898\n"
    "https://www.example.com/123456g7adfadfa0909009\n"
    "http://example.com/1234567\n"
    "https://example.com/1234567")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
0 голосов
/ 18 мая 2019

Просто отрицательный прогноз для цифры после сопоставления 4-6 цифр:

example.com\/\d{4,6}(?!\d).*

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

...