Регулярное выражение: подстрока второго последнего значения между двумя косыми чертами строки URL - PullRequest
4 голосов
/ 01 декабря 2011

У меня есть такая строка:

http://www.example.com/value/1234/different-value

Как мне извлечь 1234?

Примечание: в конце может быть косая черта:

http://www.example.com/value/1234/different-value
http://www.example.com/value/1234/different-value/

Ответы [ 4 ]

4 голосов
/ 01 декабря 2011
/([^/]+)(?=/[^/]+/?$)

должно работать.Возможно, вам придется форматировать его по-разному в зависимости от языка, который вы используете.Например, в Ruby это

if subject =~ /\/([^\/]+)(?=\/[^\/]+\/?\Z)/
    match = $~[1]
else
    match = ""
end
1 голос
/ 01 декабря 2011

Javascript:

var myregexp = /:\/\/.*?\/.*?\/(\d+)/;
var match = myregexp.exec(subject);
if (match != null) {
    result = match[1];
}

Работает с вашими примерами ... Но я уверен, что это вообще не получится ...

Ruby edit:

if subject =~ /:\/\/.*?\/.*?\/(.+?)\//
    match = $~[1]

Это работает работает.

0 голосов
/ 20 июня 2017

Я думаю, что это немного проще, чем принятый ответ, потому что он не использует положительный прогноз (?=), а просто делает последний слэш необязательным с помощью символа ?:

^.+\/(.+)\/.+\/?$

В Ruby:

STDIN.read.split("\n").each do |nextline|
   if nextline =~ /^.+\/(.+)\/.+\/?$/
    printf("matched %s in %s\n", $~[1], nextline);
   else
    puts "no match"
   end
end

Live Demo


Давайте разберем, что происходит:

  • ^: начало строки
  • .+\/: сопоставить что-либо (с жадностью) до косой черты
  • (.+)\/: наша группа захвата для 1234 указана в скобках.За этим следует еще один удар.
    • Поскольку предыдущее совпадение соответствует второму или третьему последнему слешу, оно будет соответствовать последнему или второму последнему слешу соответственно
  • .+:соответствовать чему угодно.Это будет после нашего 1234, поэтому мы предполагаем, что есть символы после 1234/ (different-value)
  • \/?: опционально соответствуют другому слешу (слеш после different-value)
  • $: соответствует концу строки

Обратите внимание, что в URL у вас, вероятно, не будет пробелов.Я использовал символ ., потому что его легко отличить, но, возможно, вы могли бы использовать \S вместо того, чтобы сопоставлять не пробелы.

Кроме того, вы можете использовать \A вместо ^, чтобы соответствовать началустрока (вместо разрыва строки) и \Z вместо $ для соответствия концу строки (вместо разрыва строки)

0 голосов
/ 19 июня 2017

Используйте Slice для позиционного извлечения

Если вы всегда хотите извлечь 4-й элемент (включая схему) из URI и уверены, что ваши данные регулярные, вы можете использовать Array # slice следующим образом.

'http://www.example.com/value/1234/different-value'.split('/').slice 4
#=> "1234"

'http://www.example.com/value/1234/different-value/'.split('/').slice 4
#=> "1234"

Это будет надежно работать независимо от того, есть ли косая черта или нет, есть ли у вас больше , чем 4 элемента после разделения, и независимо от того, есть ли у вас или нетэтот четвертый элемент всегда строго числовой.Это работает, потому что это основано на положении элемента в пути, а не на содержимом элемента.Однако в результате вы получите nil , если попытаетесь проанализировать URI с меньшим количеством элементов, таких как http://www.example.com/1234/.

Использовать сканирование / сопоставление для извлечения шаблона

В качестве альтернативы, если вы знаете, что искомый элемент всегда является единственным, полностью состоящим из цифр, вы можете использовать String # match с осмотрами для извлечения только числовой части строки.

'http://www.example.com/value/1234/different-value'.match %r{(?<=/)\d+(?=/)}
#=> #<MatchData "1234">

$&
#=> "1234"

Обратные и прогнозные утверждения необходимы для привязки выражения к пути.Без них вы тоже подберете такие вещи, как w3.example.com.Это решение является лучшим подходом, если позиция целевого элемента может измениться, и если вы можете гарантировать, что ваш интересующий элемент будет единственным, который соответствует привязанному регулярному выражению.

Еслибудет более одного совпадения (например, http://www.example.com/1234/5678/), тогда вы можете использовать String # scan вместо того, чтобы выбрать первое или последнее совпадение.Это одна из тех вещей, которые «знают ваши данные»;если у вас неправильные данные, то регулярные выражения не всегда являются лучшим выбором.

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