Извлечь строку чисел из URL с помощью регулярного выражения PIG

Я использую PIG для создания списка URL-адресов, которые были недавно посещены. В каждом из URL-адресов есть строка чисел, представляющая посещенную страницу продукта. Я пытаюсь использовать regex_extract_all() Функция для извлечения только строки чисел, длина которых варьируется от 6 до 8. Строка цифр можно найти сразу после jobs2/view/ и обычно заканчивается +&cd но иногда они могут заканчиваться ),

Вот несколько примеров URL:

( http://a.com/search?q=cache:QD7vZRHkPQoJ:ca.xyz.com/jobs2/view/17069404+&cd=1&hl=en&ct=clnk&gl=ca) ( http://a.com/search?q=cache:G9323j2oNbAJ:ca.xyz.com/jobs2/view/5977065+&cd=1&hl=en&ct=clnk&gl=ca) ( http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk) ( http://a.com/search?q=cache:aNspmG11AJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk) ( http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=cl k & gl = Нк)

Вот текущее регулярное выражение, которое я использую:

J = FOREACH jpage GENERATE FLATTEN(REGEX_EXTRACT_ALL(TEXTCOLUMN, '\/view\/(\d+)\+\&')) as (output:chararray)

Я также пробовал другие формы, такие как:

'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]', 'view.([0-9]+)', 'view\/([\d]+)\+',

'[0-9][0-9][0-9]+', а также'[0-9][0-9][0-9]*'; ни одна из которых не работает.

Кто-нибудь может помочь здесь или есть другой способ сделать это?

Высоко ценится, мм

2 ответа

Причина "Неожиданный символ" D "" заключается в том, что вам нужно поставить двойной, а не одиночный. например, просто замените [\d+] на [\\d+]

Здесь ваше решение, пожалуйста, проверьте все ваши входные строки

input.txt
http://a.com/search?q=cache:QD7vZRHkPQoJ:ca.xyz.com/jobs2/view/17069404+&cd=1&hl=en&ct=clnk&gl=ca  
http://a.com/search?q=cache:G9323j2oNbAJ:ca.xyz.com/jobs2/view/5977065+&cd=1&hl=en&ct=clnk&gl=ca  
http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk  
http://a.com/search?q=cache:aNspmG11AJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk  
http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clk&gl=hk  
http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928)=2&hl=zh-TW&ct=clk&gl=hk  
http://webcache.googleusercontent.com/search?q=cache:http://my.linkedin.com/jobs2/view/9919248

Updated Pigscript:
A = LOAD 'input.txt' as line;
B = FOREACH A GENERATE REGEX_EXTRACT(line,'.*/view/(\\d+)([+|&|cd|)?]+)?',1);
dump B;

(17069404)
(5977065)
(16988928)
(16988928)
(16988928)
(16988928)

Я не знаком с PIG, но это регулярное выражение будет соответствовать вашей цели:

(?<=/jobs2/view/)\d+

Используя (не потребляющий) взгляд сзади, все совпадение (а не просто группа совпадений) - это ваш номер.

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