2011-11-23 33 views
2

我需要刪除用戶代理字符串的「括號內」部分中的第三個和後續值。Java或Pig正則表達式從UserAgent字符串去除值

爲了得到

的Mozilla/4.0;

從(兼容MSIE 8.0)

的Mozilla/4.0(兼容; MSIE 8.0; Windows NT的6.0;三叉戟/4.0; GTB6; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; WinTSI 06.12.2009; .NET CLR 3.0.30729; .NET4.0C)

我成功地使用sed命令

sed 's/(\([^;]\+; [^;]\+\)[^)]*)/(\1)/' 

我需要一個Java正則表達式來得到相同的結果Apache Pig。 任何人都可以幫助我將上面的sed正則表達式重新寫入Java?

喜歡的東西:

new = FOREACH userAgent GENERATE FLATTEN(EXTRACT(userAgent, 'JAVA REGEX?') as (term:chararray); 

回答

2

我不使用Pig,但通過文檔查看會發現一個REPLACE函數,它包裝了Java的replaceAll()方法。試試這個:

REPLACE(userAgent, '\(([^;]+; [^;]+)[^)]*\)', '($1)') 

這應該匹配用戶代理字符串的整個括號內的部分,並只用前兩個分號分隔的條款將取代它的內容,就像你的sed命令執行。

+0

謝謝。但我無法得到這個'user_agent = FOREACH logs_filtered5 GENERATE FLATTEN(EXTRACT(userAgent,'\(([^;] +; [^;] +)[^)] * \)'))as(user_agent) ; '工作,我在分析過程中總是收到ERROR 1000:錯誤。遇到:「(」(40),after:「\'\\」。也許這是PIG專用的東西。 – Martin

+0

也許它希望反斜槓能夠被轉義,就像在Java字符串中一樣。試試''\\(([^;] +; [^;] +)[^)] * \\'' –

+0

我也試過了,但沒有幫助'ERROR org.apache.pig.tools .grunt.Grunt - 解析過程中出錯1000:錯誤。詞彙錯誤在第36行第80列。遇到:之後:「\'\\\\(([^;」'。你認爲這可能與交互模式下的PIG有關嗎? – Martin

1

在java中,如果您使用的匹配器類,你可以提取捕獲組。以下內容似乎可以做你想做的事情,至少對於你提供的測試用例來說。

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class Test { 

    public static void main(String[] args){ 
     String str = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; WinTSI 06.12.2009; .NET CLR 3.0.30729; .NET4.0C)"; 
     //str = "aaa"; 
     Pattern pat = Pattern.compile("(.*\\(.*?;.*?;).*\\)"); 
     Matcher m = pat.matcher(str); 
     System.out.println(m.lookingAt()); 
     String group = m.group(1) + ")"; 
     System.out.println(group); 
    } 
} 

嗯......我似乎回答了錯誤的問題,因爲你問的是如何從'PIG'不是直接JAVA。

+0

對不起,我不知道如何在PIG中使用你的代碼來測試它。不管怎樣,謝謝你。 – Martin

0

由於沒有建議了兩項解決方案似乎PIG工作,我將發佈其採用過的流sed的解決方法:

user_agent_mangled = STREAM logs THROUGH `sed 's/(\\([^;]\\+; [^;]\\+\\)[^)]*)/(\\1)/'`; 

這工作得很好,但我還是喜歡原生PIG溶液(使用EXTRACT或更換服務功能)。