Regex для извлечения последней части числа изменяющегося URL

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

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

  1. Увеличить последнее число 20 на 10:

    http://forums.scamadviser.com/site-feedback-issues-feature-requests/20/
    
  2. Увеличить последнее число 50 на 10:

    https://forums.questionablecontent.net/index.php/board,1.50.html
    
  3. Увеличить последнее число 30 на 10:

    https://forums.comodo.com/how-can-i-help-comodo-please-we-need-you-b39.30/
    

4 ответа

Решение

С \d+(?!.*\d) регулярное выражение, вы получите последний кусок цифры в строке. Затем используйте s.gsub с блоком для изменения числа и возврата к результату.

Смотрите это Ruby демо:

strs = ['http://forums.scamadviser.com/site-feedback-issues-feature-requests/20/', 'https://forums.questionablecontent.net/index.php/board,1.50.html', 'https://forums.comodo.com/how-can-i-help-comodo-please-we-need-you-b39.30/']
arr = strs.map {|item| item.gsub(/\d+(?!.*\d)/) {$~[0].to_i+10}}

Замечания: $~ является объектом MatchData, и с использованием [0] Индекс мы можем получить доступ ко всему значению соответствия.

Результаты:

http://forums.scamadviser.com/site-feedback-issues-feature-requests/30/
https://forums.questionablecontent.net/index.php/board,1.60.html
https://forums.comodo.com/how-can-i-help-comodo-please-we-need-you-b39.40/

Попробуйте это регулярное выражение:

\d+(?=(\/)|(.html))

Будет извлечен последний номер.

Демо: https://regex101.com/r/zqUQlF/1


Замените обратно этим регулярным выражением:

(.*?)(\d+)((\/)|(.html))

Демо: https://regex101.com/r/zqUQlF/2

Как это:

urls = ['http://forums.scamadviser.com/site-feedback-issues-feature-requests/20/', 'https://forums.questionablecontent.net/index.php/board,1.50.html', 'https://forums.comodo.com/how-can-i-help-comodo-please-we-need-you-b39.30/']
pattern = /(\d+)(?=[^\d]+$)/

urls.each do |url|
    url.gsub!(pattern) {|m|  m.to_i + 10}
end

puts urls

Вы также можете проверить это онлайн здесь: https://ideone.com/smBJCQ

Это регулярное выражение сопоставляет только последнее целое число в каждом URL-адресе с помощью заглядывания (которое "видит" шаблоны, но не использует никаких символов):

\d+(?=\D*$)

онлайн демо здесь.

Другие вопросы по тегам