2014-09-19 69 views
0

我使用PIG生成最近訪問過的URL列表。在每個網址中,都有一串數字代表所訪問的產品頁面。我試圖用一個regex_extract_all()函數來提取數字的字符串,其長度從6-8變化。數字串可以在jobs2/view/之後直接找到,通常以+&cd結尾,但有時它們可​​能以)結尾。使用正則表達式從URL中提取數字字符串PIG

這裏有幾個示例網址:

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ķ& GL = HK)

這裏是當前正則表達式我使用:

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

我也試過o療法形式如:

'[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]*';沒有一個工作。

任何人都可以在這裏協助或有其他方式去解決嗎?

大加讚賞, MM

回答

0

我不熟悉的豬,但是這正則表達式將匹配您的目標:

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

通過使用(非消費)向後看,在整個比賽(不只是一個的比賽)是你的號碼。

+0

ERROR 1200:<第1行7,第68列>意外字符'D' – user3521607 2014-09-19 22:06:29

1

「意外字符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)

+0

在字符類中添加了符號以匹配字符序列。 – 2014-09-20 03:27:54

+0

看起來不錯,但沒有捕捉到數字串以「)」結尾而不是通常的「+&...」的情況。 – user3521607 2014-09-20 16:56:51

+0

你能舉個例子嗎? – 2014-09-20 17:00:40