2017-01-12 2 views
1

Я создаю парсер URL-адресов и имею три вида URL-адресов, из которых я хотел бы извлечь номер с конца URL-адреса и увеличивать извлеченный номер на 10 и обновлять URL. Я пытаюсь использовать регулярное выражение для извлечения, но я новичок в регулярном выражении и испытываю проблемы.Регулярное выражение для извлечения последней части номера изменяющегося 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. Increment последний номер 30 на 10:

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

Зачем создавать еще один велосипед? Между URI Ruby и [Addressable :: URI] (https://github.com/sporkmonger/addressable) есть много хорошо протестированного кода. –

+0

Мы хотели бы видеть вашу попытку решить это, а не писать для вас код, который не имеет никакого отношения к тому, что вы пробовали. –

ответ

2

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

См this Ruby demo:

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/ 
+0

Небольшое обновление: если строка может иметь разрывы строк, используйте '/ \ d + (?!. * \ D)/m' (но я подозреваю, что это не так). –

+0

Если бы я хотел сделать только один URL-адрес за раз, а не использовать эту карту, как бы мы это сделали? –

+0

Он уже указан в коде: 'item = item.gsub (/ \ d + (?!. * \ D) /) {$ ~ [0] .to_i + 10}' –

0

это регулярное выражение соответствует только последнему целому числу в каждом URL, используя предпросмотр (который «видит» модель, но не едят никаких символов):

\d+(?=\D*$) 

online demo здесь.

+0

согласен, отредактирован. – sweaver2112

0

Как это:

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

Смежные вопросы