Java或Pig正则表达式从UserAgent字符串中去除值

时间:2011-11-23 02:03:59

标签: java regex sed hadoop apache-pig

我需要删除“括号”中的第三个及后续值。用户代理字符串的组件。

为了获得

  

Mozilla / 4.0(兼容; MSIE 8.0)

  

Mozilla / 4.0(兼容; 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)

我成功使用了sed命令

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

我需要在Apache Pig中使用Java正则表达式获得相同的结果。 有人可以帮我把上面的sed正则表达式重写成Java吗?

类似的东西:

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

3 个答案:

答案 0 :(得分:2)

我不使用Pig,但浏览文档会显示一个包含Java replaceAll()方法的REPLACE函数。试试这个:

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

它应匹配UserAgent字符串的整个带括号的部分,并用前两个以分号分隔的术语替换其内容,就像你的sed命令一样。

答案 1 :(得分:1)

在java中,如果使用Matcher类,则可以提取捕获组。以下似乎可以满足您的需求,至少对于您提供的测试用例而言。

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那里做到这一点。

答案 2 :(得分:0)

由于两个建议的解决方案似乎都不适用于PIG,我将发布使用sed到流的解决方法:

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

这很好用,但我仍然更喜欢原生PIG解决方案(使用EXTRACT或REPLACE功能)。