Regex: извлечь наибольшее число из x в y цифр - PullRequest
1 голос
/ 25 февраля 2020

У меня есть URL, отформатированный следующим образом: https://www.mywebsite.com/subdomain/123456789.htm. Я знаю, что номер веб-страницы состоит из 9 или 10 цифр. Я хотел бы извлечь это число с помощью регулярных выражений.

Регулярное выражение, которое я использую для выполнения этой операции:

^ https://www.mywebsite.com/ [A-Za-z0-9 _.- ~ /] + ([0-9] { 9,10}). Htm $

Проблема в том, что, когда число имеет длину 10 цифр, я получаю совпадение, которое является хорошим, но фиксируются только последние 9 цифр. Например: https://www.mywebsite.com/subdomain/1234567890.htm захватывает только 234567890.

Я мог бы легко создать два регулярных выражения (одно с 9 цифрами и одно с 10) и взять самое длинное число, если оба совпадения, но есть ли какой-нибудь элегантный способ решить эту проблему с помощью регулярных выражений?

РЕДАКТИРОВАТЬ

После замечаний, которые были сделаны ниже, на самом деле в моем исходном регулярном выражении есть ошибка: первая группа символов соответствует первому di git из 10, и оставляет только 9 других для группы захвата. Я добавил скриншот ниже. Добавление форварда sla sh в Regex до того, как группа захвата решила проблему, спасибо!

Wrongly formatted Regex

Ответы [ 3 ]

3 голосов
/ 25 февраля 2020

Согласно @TheFourthBird, вам не хватает совпадения на форварде sh. Возможно, немного отличающийся от вас подход - это группа без захвата:

^https://www.mywebsite.com/(?:[^/]+/)+(\d{9,10}).htm$
2 голосов
/ 25 февраля 2020

Класс символов [A-Za-z0-9_.-~/]+ соответствует всем символам, которые следуют до конца строки.

Эта часть ([0-9]{9,10}). будет возвращаться назад, пока не сможет соответствовать полученным цифрам, начиная с 9 цифры и это будет в группе захвата.

Примечание , чтобы либо экранировать дефис \-, либо поместить его в начало или конец класса символов, иначе он может совпадать с range.

Один из вариантов - использовать слово bounary \b перед сопоставлением цифр

^https://www\.mywebsite\.com/[A-Za-z0-9_.~/-]+\b([0-9]{9,10})\.htm$

Regex demo

Другой способ может быть соответствие / прямо перед цифрами.

^https://www\.mywebsite\.com/[A-Za-z0-9_.~/-]+/([0-9]{9,10})\.htm$

Regex demo

Если также могут быть символы a-zA-Z или underscoe перед цифрами и поддерживается просмотр, вы также можете утверждать, что до (?<!\d)

^https://www\.mywebsite\.com/[A-Za-z0-9_.~/-]+(?<!\d)([0-9]{9,10})\.htm$

Regex demo

1 голос
/ 25 февраля 2020

Еще один подход. Получаются все числа от / до htm

(\d+)(?=\.htm)

RegexDemo

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